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


431

我正在阅读一些C课程注释,并且每个 C程序源文件#都在程序的第一行以一个开始。

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

是什么原因#

(现在已经过期了,我真的不能问这个问题。)

这是一个例子:

#

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


3
我把第一个例子放在课程笔记中。从字面上看是#,然后是空白行,然后是程序。
为主人

30
空的主要目的#是混淆。如果您想混淆所有人,例如,可以使用该行启动所有源文件#//#BEGIN#\\#(这绝对不起作用)。
伦丁

3
@Bathsheba这可能是其中一个人cl.cam.ac.uk/people/academic.html
TylerH

7
@Bathsheba最后一个时间戳显示,您在提出问题后仅一分钟就给出了一个相当详细的答案,并附有C99参考标准的相关报价。你绝对是一个阴谋家。可能在光明会中。但是,这两个问题最终为何如此受欢迎?
Nat

Answers:


614

哇,这个要求可以追溯到 1970年代。

在预标准化C的早期,如果您想调用预处理器,则必须#在源文件的第一行中首先编写a 。#在文件顶部写入a 可以灵活地放置其他预处理程序指令。

由伟大的丹尼斯里奇自己原来的草案C

12.编译器控制线

为了使预处理程序被调用,程序的第一行必须以#开头。由于预处理器会忽略空行,因此该行无需包含其他信息。

那个文件使人读得很好(让我像疯猫一样跳这个问题)。

我怀疑这只是讲师多愁善感-自ANSI C以来就不再需要它了。


22
据我了解,要求不是第一个字符#本身必须是a ,而是以a开头#,所以为什么不直接使用a #include?还是我理解错了?
Federico klez Culloca

14
@Bathsheba“ 为了使该预处理器被调用,程序的第一行必须以#开头。由于空行被预处理器忽略,因此该行不需要包含其他信息。 ” <-因此可以已经包含预处理程序指令,但这不是必需的

5
当我开始使用C(1980)进行编程时,这不是必需的。直到1989
。– pojo-guy

29
@ federico-klez-culloca如果它成为包含文件,则该文件可能最终没有前导#出现,因为将来有人删除了不需要的包含,而没有意识到前导#的副作用。
Fadeway

4
@Casanova-否。这样做并接受这样的答案违反了站点规则。如果您理解我的意思,即使没有相互投票,在不同帐户下进行询问和回答也违反网站规则的精神。尽管使用相同的帐户回答您自己的问题并接受该回答也没有什么害处-我过去已经这样做过。
芭丝谢芭

1

什么也没做

从C / C ++的ISO标准开始:

形式的预处理指令

# new-line

没有效果。

因此,在当今的编译器中,空哈希不能执行任何操作(就像- new-line ;没有功能)。


PS:在预先标准化的C中# new-line它起着重要作用,它被用来调用C预处理程序(如@Bathsheba所指出)。因此,这里的代码要么是在那个时间段内编写的,要么是来自习惯的。


-5

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

在编译过程中,C源代码必须跨越预处理器部分。但是如何告诉编译器对代码进行预处理?...时间#符号被引入到编译器的预处理指示器中。

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

就像一样#include <stdio.h>,标准I / O功能将添加到您的源代码中。

如果您有Linux机器,请像进行编译gcc -save-temps source_code.c。并查看编译器输出。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.