首页 > 解决方案 > 不带括号的 C 函数调用

问题描述

这是一个简单的 C 程序:

#include <stdio.h>

int main(void)
{
    printf("Display something\n");
    fflush stdout;
    return 0;
}

使用 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;
                  ^~~~~~~~~

那么,fflush函数会发生什么?有人可以解释一下吗?您与其他 C 编译器有相同的行为吗?

标签: cfunctionmingw

解决方案


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

   fflush 
# 5 "test.c" 3
          (&(* _imp___iob)[1])
# 5 "test.c"
                ;

如您所见,它是一个带有括号stdout的宏。(&(* _imp___iob)[1])

所以编译器使用这些括号并且语法没问题。

但这仅仅是因为宏魔法,而且大多数宏都受到括号保护以避免与其他标记的副作用(例如运算符优先级)

您可以使用这个简单的代码复制它而无需任何包含:

#define arg ("hello")

void f(const char *x)
{
}

int main(int argc, char** argv)
{
    f arg;
    return 0;
}

当然,这是不好的做法,会让 IDE(和人类)感到困惑,所以不要这样做。


推荐阅读