C函数调用无括号

Gho*_*h21 8 c mingw function

这是一个简单的C程序:

#include <stdio.h>

int main(void)
{
    printf("Display something\n");
    fflush stdout;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译msys2 mingw-w64 gcc版本7.3.0和选项-Wall,一切正常,就好像第5行一样fflush(stdout);.

我尝试用我自己的函数重现这样的调用,但是我得到了完全预期的错误

src/main.c: In function 'int main(int, char**)':
src/main.c:5:18: error: expected ';' before 'parameter'
  custom_function parameter;
                  ^~~~~~~~~
Run Code Online (Sandbox Code Playgroud)

那么,该fflush功能会发生什么?有人可以解释一下吗?你和其他C编译器有相同的行为吗?

Jea*_*bre 13

让我们看看预处理器输出(使用MinGW和gcc -E test.c命令行):

   fflush 
# 5 "test.c" 3
          (&(* _imp___iob)[1])
# 5 "test.c"
                ;
Run Code Online (Sandbox Code Playgroud)

如你所见,stdout是一个(&(* _imp___iob)[1])用括号扩展的宏.

所以编译器使用这些括号,语法没问题.

但这只是因为宏观魔法,以及大多数宏受括号保护以避免与其他令牌产生副作用的事实(例如运算符优先)

你可以使用这个简单的代码重现那些没有任何包含:

#define arg ("hello")

void f(const char *x)
{
}

int main(int argc, char** argv)
{
    f arg;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

当然这是不好的做法,混淆IDE(和人类),所以就是不要这样做.