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;
} |
-
stackoverflow.com/questions/35207515/…
-
我把第一个例子放在课程笔记中。字面上有#,然后是空行,然后是程序。
-
空#的主要目的是混淆。如果你想让所有人感到困惑,你可以用例如#//#BEGIN#\\#行开始所有的源文件(这绝对没有任何意义)。
-
@Bathsheba我认为他还在普林斯顿
-
@Bathsheba这可能是其中一个人cl.cam.ac.uk/people/academic.html
-
@Bathsheba上一篇文章的时间戳显示,在问题提出后一分钟,您给出了一个相当详细的答案,并附有C99参考标准的相关引用。你绝对是一个阴谋者。可能在光明会。这两个问题怎么会这么受欢迎呢?
-
对我来说,受欢迎程度是奇怪的。通过编辑,您可以有五分钟的宽限度来使编辑正确,直到该点的编辑历史记录不会显示在历史记录中 - 只是五分钟的草稿和第一次尝试的时间。现在这个问题与另一个问题有关,这只会增加对两者的投票。
哇,这个要求可以追溯到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开始就没有必要。
-
据我了解,要求不是第一个字符本身必须是一行#,只是它以#开头,为什么不直接转到#include?或者我理解错了?
-
@Bathsheba"为了使这个预处理器被调用,程序的第一行必须以#开头。由于预处理器忽略了空行,因此该行不需要包含其他信息。" < - 所以它已经可以包含一个预处理器指令,但它没有必要....
-
他们已经声明必须修复这种行为(见附录2中的B.9)......
-
当我开始用C(1980)编程时,这不是一个要求。 ANSI C直到1989年才被标准化。
-
@ federico-klez-culloca如果它成为一个包含,那么该文件最终可能没有前导#,因为将来有人会删除不需要的包含而不知道引导#的副作用。
-
我是否正确理解这只是C编译器中的一个错误,他们已经知道他们必须修复它们,但他们仍然发布它并将这些注释添加到最终用户?嗯,我能说什么,嗯。
-
@Angew - 你错过了这一点。通过以空行开头#,然后您可以使用各种注释行(单独或以有效注释形式集体)跟随它,然后使用第一个#include跟随它们。没有人建议#曾经是C中的评论符号,但显然还有其他语言
-
只是想知道,你是否使用假帐户来提问这个问题?
-
@Casanova - 不。这样做并接受这样的答案违反了网站规则。如果得到我的意思,即使没有相互投票,在不同账户下询问和回答也违反了网站规则的精神。使用相同的帐户回答你自己的问题并接受答案是没有害处的 - 我过去就是这么做的。
-
@MrLister我会假设,这是关于性能的。 C编译器检查第一个字节是否为'#',如果是,则启动预处理器。如果不是,则完全跳过预处理步骤,在编译期间节省一些时间。记住,那是20世纪70年代。
什么也没做
截至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。并查看编译器输出。
......好.....