为什么我的讲师写的所有C文件的第一行都以一个#开头?

我正在浏览一些C课程笔记,每一个 C程序源文件在程序的第一行以一个#开始。

然后是空行,然后是main函数。

#的原因是什么?

(现在已经过期了,我真的不能问那个家伙。)

这里有一个例子:

#


#include <stdio.h>
int main() {
printf("Hello, World!");
return 0;
}
22983 次浏览

哇,这个要求可以追溯到20世纪70年代。

在预标准化C语言的非常早期的时代,如果你想调用预处理器,那么你必须在源文件的第一行写一个#。在文件顶部编写只有#可以灵活地放置其他预处理器指令。

伟大的丹尼斯·里奇亲自起草的C字草稿:

12. 编译器控制行

< p >[…为了使[该]预处理器被调用,必须使用very 程序的第一行以#开头。因为空行被预处理器忽略,所以这一行不需要包含其他行 信息。< / p >

这份文件非常值得一读(让我像疯猫一样跳到这个问题上)。

我怀疑这只是讲师的感情用事——自ANSI C以来就没有要求了。

它什么都没有

根据C/ c++的ISO标准:

表单的预处理指令

# new-line

没有效果。

所以在今天的编译器中,空哈希不做任何事情(如- 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那样编译。并查看编译器输出。