关于c预处理器:为什么我的讲师写的所有C文件都从第一行的#开头?

Why do all the C files written by my lecturer start with a single # on the first line?

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

然后是空白行,然后是其他内容后跟main函数。

#的原因是什么?

(现在这是不合时宜的,我不能真的问这个小伙子。)

这是一个例子:

1
2
3
4
5
6
7
#

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


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

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

来自伟大的丹尼斯·里奇本人的原始C选秀:

12. Compiler control lines

[...] In order to cause [the] preprocessor to be invoked, it is necessary that the very
first line of the program begin with #. Since null lines are ignored by the preprocessor, this line need contain no other
information.

那个文件可以很好地阅读(并允许我像疯猫一样跳过这个问题)。

我怀疑这是讲师只是多愁善感 - 从ANSI C开始就没有必要。


什么也没做

截至C / C ++的ISO标准:

A preprocessing directive of the form

# new-line

has no effect.

所以在今天的编译器中,空哈希没有做任何事情(比如 - new-line ;没有功能)。

PS:在预标准化的C中,??# new-line具有重要作用,它用于调用C预处理器(如@Bathsheba所指出的)。所以,这里的代码要么是在那段时间内写成的,要么是来自习惯。


您需要了解C的编译过程。因为那是"必须知道"源代码如何转换为可执行二进制代码(File)。

从编译过程来看,C源代码必须穿过预处理器部分。但是如何告诉编译器预处理代码?...时间#Signal被引入编译器的Preprocess指示器。

例如,#define PI 3.141位于源代码中。然后它将在预处理会话后更改。意思是,所有PI都将变为3.141。

这与#include 类似,标准I / O函数将添加到您的源代码中。
如果你有linux机器,编译如gcc -save-temps source_code.c。并查看编译器输出。

......好.....