这是一个简单的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(和人类),所以就是不要这样做.
| 归档时间: |
|
| 查看次数: |
135 次 |
| 最近记录: |