【问题标题】:Possible return types for a C functionC 函数的可能返回类型
【发布时间】:2014-12-21 16:39:51
【问题描述】:

C 中可能的数据类型有哪些 除了void、int、float、char、double、long和struct?

我正在编写一个正则表达式(脚本)来检测函数体的开始。 我需要返回类型,以便我可以通过将返回类型与函数名称连接起来来获取函数体。

【问题讨论】:

  • 仅供参考:使用正则表达式解析 C 可能行不通。确定变量名称和类型名称之间的区别有时取决于已定义的类型 IIRC。
  • @Mat 我正在考虑匹配函数原型,从而通过匹配“带括号的返回类型函数名”(如 int fun_name())进入函数的开头
  • @user4377237:我不明白您实际上是在解析 C. regex 听起来不像是正确的工具。考虑this sort of declaration
  • @Mat :是的,我必须找到替代解决方案

标签: c function return-value


【解决方案1】:

C 函数可以返回以下任何内容:

  • 整数数据类型(_BoolC99/char/short/int/long/long/long 和有符号/无符号变体)
  • 浮点数据类型(float/double/long double [和 _Complex 变体]C99
  • 结构和联合值(struct ...union ... 类型的值)
  • 枚举值(enum ... 类型的值)
  • 指向上述任何一个的指针(以及指向任何指针的指针)
  • 函数指针
  • 无效

在任何级别具有可选的 const 和/或 volatile 限定。当然也允许任何此类类型的 typedef 名称。

值得注意的是,C 函数不能返回函数类型的值,也不能返回数组类型的值(尽管它可以分别返回函数指针和包含数组的结构)。

【讨论】:

  • @chux:谢谢,我从 C99 中添加了 _Bool 和 _Complex。 C99 规范允许指向 _Bool 的指针(并且 IIRC sizeof(_Bool) 必须为 1,因此它不能是单个位,除非它是位域结构元素)。
  • 注意:虽然这个答案不需要,但根据您的评论,sizeof(_Bool) 必须至少 1:“_Bool 对象中的位数至少为 CHAR_BIT ” C11 §6.7.2.1
【解决方案2】:

除了数组,函数可以返回任何类型的值。

如果在结构中,则可以返回数组。

struct innerarray {
    double values[100];
};

struct innerarray fx(void) {
    struct innerarray retval;
    for (int k = 0; k < 100; k++) retval.values[k] = k;
    return retval;
}

【讨论】:

    【解决方案3】:

    任何(完整的)对象类型或void,除了数组类型,都可以由函数返回。通过structenum 关键字,程序员可以创建新类型,因此C 中的函数可以返回无限多的类型。

    【讨论】:

    • 任何类型?不是任何类型。当然不是函数类型,也不是数组。
    • void 也是一种可能的返回类型。
    【解决方案4】:

    函数可以返回void 或完整的非数组对象类型,包括用户定义的类型。

    具体来说,以下是禁止的:

    typedef int f();     // function type
    typedef int a[10];   // array type
    struct X;            // incomplete, non-array object type
    
    // f foo1();         // Error, function returning function
    // a foo2();         // Error, function returning array
    
    // struct X foo3(){} // Error, attempting to define function with incomplete
                         // return type
    
    struct X foo4();     // OK, can *declare* a function with incomplete return type
    

    【讨论】:

    • 有趣的是,C 确实有语法(理论上)来定义一个返回函数和数组类型的函数:void foo1(void)(void); 返回一个 void (void) 函数,int foo1(void)[10]; 返回一个数组。 (两者都不会编译,但你的编译器会正确推断返回类型然后禁止它)
    • @nneonneo:是的,我知道这一点,但我认为这会严重掩盖演示文稿:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-01
    • 2013-02-18
    • 2011-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多