c - 不带括号的 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 编译器有相同的行为吗?
解决方案
让我们看看预处理器的输出(使用 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(和人类)感到困惑,所以不要这样做。
推荐阅读
- excel - 使用 VBA 获取数据透视表过滤器(页面字段)中列出的所有元素
- php - HTML标记内的PHP TCPDF不需要的空白页
- react-admin - 如何在 ReferenceManyField 组件上设置默认值?
- svelte - Sapper:当导航离开带有 kwes.io 表单的页面时,如何修复“parentNode 为空”?
- c++ - 这是正确的 uint64_t 比较吗?
- asana-api - 如何在 Asana 槽 API 中删除附件
- android - setOnClusterItemClickListener:在集群项 clickListener 错误
- matlab - Matlab - 带有两个图和两个轴的条形图
- vb.net - 我们不能在 VB.NET 中第二次初始化字体吗?
- python - 我想通过在我的数据框中添加 2 个连续列来插入新列