代码之家  ›  专栏  ›  技术社区  ›  Ryan Fox

有关c中的`()`的详细信息?

  •  8
  • Ryan Fox  · 技术社区  · 16 年前

    我注意到,有时,C宏是这样编写的:

    #define foo(bar) ({ ++bar; })
    

    经过一些试验,我发现:

    1. ({}); 将编译,但不执行任何操作。(如所预料的那样)
    2. 离开 ; 关闭将导致语法错误。这样做的一个副作用是确保foo()在代码中看起来像一个函数。(尽管,如果不使用分号,错误对于诊断问题并不是很有用!)
    3. return ({}); 抱怨无效值没有被忽略,就像我试图使用一个空函数一样。

    这只是为了让开发人员在宏中添加分号,还是有其他用途?我试过谷歌,但它用标点符号失败了。这个有名字吗?

    3 回复  |  直到 16 年前
        1
  •  8
  •   Christoph    16 年前

    这是GNU扩展名 statement expressions .

    在Standard-C中声明宏时,您经常会看到 do...while(0) 用于类似目的的循环(即创建块范围)。语句表达式优于循环hack,因为它可以返回值。如果您想在Standard-C中执行类似的操作,就必须定义一个额外的函数,并失去词汇范围的便利性。

        2
  •  3
  •   Richard Pennington    16 年前

    语句表达式最酷的地方(如果有酷的地方)是最后一条语句是表达式的结果。

    #define foo(bar) ({ ++bar; 3.1415927; })
    
    int i = 0;
    float pi = foo(i);
    
        3
  •  2
  •   Nicolás    16 年前

    ()是表达式。(code;code;)是表达式内的复合语句。这是GNU C扩展。

    http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_4.html

    编辑:哇,我从谷歌得到了这个链接,一开始没注意到它是针对GCC2.95的。很古老!