嗨,我正在写一个简单的程序,我要让这个程序打印出一个整数。
#include <stdio.h> int main() { int linux = 701; printf("%d", linux); return 0; }
够简单吧。真的吗?
我把它存成了code.c
现在我编译并运行它:
$ gcc code.c && ./a.out
糟糕!,编译失败,出现了下面的错误信息:
code.c: In function ‘main’: code.c:4:6: error: expected identifier or ‘(’ before numeric constant int linux = 701; ^
这是一个在线编译这段代码的链接:http://ideone.com/kQCmVL
困惑 !!
在谷歌上搜索这个错误——得到的信息是这种错误需要对代码进行预处理。
于是,我在编译时带上了-E
参数,它能让编译在预处理后停止:
$ gcc -E code.c
预处理过的main()
函数代码显示如下:
int main() { int 1 = 701; printf("%d\n", 1); return 0; }
我晕!C语言的预处理编辑器竟然将变量linux
换成了整数1
。当编译器遇到了int 1 = 701;
语句时,抛出了错误。
现在,我不对变量linux
赋任何值:
#include <stdio.h> int main() { printf("%d\n", linux); return 0; }
编译并运行:
$ gcc code.c && ./a.out
在线编译的链接地址:http://ideone.com/kyrNDw
编译成功并且输出:
1
事实证明,linux总是Number 1 🙂
我的输出 是 701! 嗯
其实是这样的, 在VS里你printf(“%d”, WIN32); 也是1, 一般都会有这样一个变量决定环境
只不过是系统的变量而已,你随便去哪个语言里用上系统已有的都会有问题的,这有什么大惊小怪的
不是系统变量 ,
gcc在不指定-std参数的时候默认使用gnu89,
gnu89的预定义宏里面有#define linux 1。
如果使用C90什么的,就不会有了。
楼上真相了。。
编译器的历史遗留问题。因为,以前的编译器实现方式不规范,没有完全遵循语言标准(或者说当时还没有语言标准,相当于混沌初开的时候),详细参考 stackoverflow 上面的讨论:
事实证明 unix 也是 NO.1。其实这不过是预定义宏(Predefined Macros),就像 __cplusplus 一样。另外,VS 环境下, WIN32 不是预定义宏哦,是通过编译选项 -DWIN32 定义的, _WIN32 才是预定义宏。
有意思,不知道windows下有没有类似变量~
gcc -std=gnu90 code.c
gcc -std=c90 code.c
標準問題而已……
呵呵,保 留 字 不可乱用啊!!!
哈哈哈,笑尿。
哈哈哈哈
1应该是指true,判定什么系统时可以直接写if (linux) { … },不是number 1。