我正在阅读一些C课程笔记,每个C程序源文件在程序的第一行都以一个#开头。
然后是空行,然后是main函数。
#的原因是什么?
(现在已经过期了,我真的不能问那个家伙。)
这里有一个例子:
#
#include <stdio.h>
int main() {
printf("Hello, World!");
return 0;
}
我正在阅读一些C课程笔记,每个C程序源文件在程序的第一行都以一个#开头。
然后是空行,然后是main函数。
#的原因是什么?
(现在已经过期了,我真的不能问那个家伙。)
这里有一个例子:
#
#include <stdio.h>
int main() {
printf("Hello, World!");
return 0;
}
哇,这个要求可以追溯到20世纪70年代。
在C语言预标准化的早期,如果你想调用预处理器,那么你必须在源文件的第一行写一个#。只在文件顶部写入#可以灵活地放置其他预处理器指令。
伟大的Dennis Ritchie自己写的C字初稿:
12. 编译器控制行 […为了使[该]预处理器被调用,必须使用very 程序的第一行以#开头。因为空行被预处理器忽略,所以这一行不需要包含其他行 信息。
这份文件非常值得一读(让我像疯猫一样跳到这个问题上)。
我怀疑这只是讲师的感情用事——自ANSI C以来就没有要求了。
它什么都没有
根据C/ c++的ISO标准:
表单的预处理指令 #新行 没有效果。
所以在今天的编译器中,空哈希不做任何事情(比如- new-line;没有功能)。
PS:在*预标准化的C*中,# new-line有一个重要的角色,它被用来调用C预处理器(正如@Bathsheba指出的那样)。所以,这里的代码要么是在那个时间段内写的,要么是来自程序员的习惯。
编辑:最近我遇到了这样的代码-
#ifdef ANDROID
#
#define DEVICE_TAG "ANDROID"
#define DEBUG_ENABLED
#
#else
#
#define DEVICE_TAG "NOT_ANDROID"
#
#endif /* ANDROID */
在这里,那些空散列只是为了让代码看起来更好。它还通过指出它是一个预处理器块来提高可读性。
你需要了解c语言的编译过程,因为这是“必须知道”源代码如何转换为可执行二进制代码(文件)。
在编译过程中,C源代码必须穿过预处理器段。但是如何告诉编译器预处理代码?time#符号被引入到编译器的预处理指示器中。
例如,#define PI 3.141在源代码中。然后它将在预处理会话之后更改。也就是说,所有的PI都会变成3.141。
这就像#include <stdio.h>,标准I/O函数将添加到您的源代码中。
如果你有一台Linux机器,像gcc -save-temps source_code.c这样编译。并查看编译器输出。