我正在阅读一些C课程笔记,每个C程序源文件在程序的第一行都以一个#开头。

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

#的原因是什么?

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

这里有一个例子:

#

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

当前回答

你需要了解c语言的编译过程,因为这是“必须知道”源代码如何转换为可执行二进制代码(文件)。

在编译过程中,C源代码必须穿过预处理器段。但是如何告诉编译器预处理代码?time#符号被引入到编译器的预处理指示器中。

例如,#define PI 3.141在源代码中。然后它将在预处理会话之后更改。也就是说,所有的PI都会变成3.141。

这就像#include <stdio.h>,标准I/O函数将添加到您的源代码中。

如果你有一台Linux机器,像gcc -save-temps source_code.c这样编译。并查看编译器输出。

其他回答

你需要了解c语言的编译过程,因为这是“必须知道”源代码如何转换为可执行二进制代码(文件)。

在编译过程中,C源代码必须穿过预处理器段。但是如何告诉编译器预处理代码?time#符号被引入到编译器的预处理指示器中。

例如,#define PI 3.141在源代码中。然后它将在预处理会话之后更改。也就是说,所有的PI都会变成3.141。

这就像#include <stdio.h>,标准I/O函数将添加到您的源代码中。

如果你有一台Linux机器,像gcc -save-temps source_code.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 */

在这里,那些空散列只是为了让代码看起来更好。它还通过指出它是一个预处理器块来提高可读性。

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

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

伟大的Dennis Ritchie自己写的C字初稿:

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

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

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