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

为什么我的讲师编写的所有C文件都以第一行的一个#开头?,c,c-preprocessor,C,C Preprocessor,我正在阅读一些C课程笔记,每个C程序源文件都以程序第一行的一个开头 然后是空行,后面是main函数 产生#的原因是什么 (现在已经过期了,我真的不能问那家伙。) 下面是一个例子: # #包括 int main(){ printf(“你好,世界!”); 返回0; } 哇,这个要求可以追溯到20世纪70年代 在预标准化C的早期,如果您想调用预处理器,那么您必须在源文件的第一行中首先编写一个#。在文件顶部只写一个#,可以灵活地放置其他预处理器指令 发件人: 12编译器控制行 […]为了使[预处理器]被

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

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

产生
#
的原因是什么

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

下面是一个例子:

#
#包括
int main(){
printf(“你好,世界!”);
返回0;
}

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

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

发件人:

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

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

我怀疑是讲师太感情用事了,因为ANSI C没有做任何事情,所以这一点肯定没有被要求 从C/C++的ISO标准开始:

表单的预处理指令

#新行

没有效果

因此,在今天的编译器中,空哈希没有任何作用(比如-
新行;
没有任何功能)


PS:在预标准化C中,
#新行
起着重要作用,它被用来调用C预处理器(正如@Bathsheba所指出的)。所以,这里的代码要么是在那个时间段内编写的,要么来自习惯


编辑:最近我遇到过这样的代码-

#ifdef ANDROID
#
#define DEVICE_TAG "ANDROID"
#define DEBUG_ENABLED
#
#else
#
#define DEVICE_TAG "NOT_ANDROID"
#
#endif /* ANDROID */

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

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

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

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

这与包含类似,标准I/O函数将添加到源代码中


如果您有一台Linux机器,请像
gcc-save temps source\u code.c
那样编译。并查看编译器输出。

我在课程笔记中列出了第一个示例。从字面上看,有
,然后是空行,然后是程序。空
的主要目的是混淆。如果你想把每个人都搞糊涂,你可以用
\/\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\/code>这一行来启动所有的源文件(这一行完全不起作用)@Bathsheba可能是这些人中的一个@Bathsheba最后一个节目上的时间戳,你在提问一分钟后给出了一个相当详细的答案,并引用了C99参考标准中的相关内容。你绝对是个阴谋家。可能是在光明会。这两个问题怎么会如此流行呢?据我所知,要求不是第一个字符必须是一行中的
,而是它以
开头,那么为什么不直接使用
#include
?还是我理解错了?@Bathsheba“为了调用这个预处理器,程序的第一行必须以#开头。因为预处理器忽略了空行,所以这一行不需要包含其他信息。”当我在C(1980)中开始编程时,这不是一个要求。ANSI C直到1989年才被标准化。@federico klez culloca如果它成为一个include,文件可能会没有前导字符,因为将来有人在不知道前导字符的副作用的情况下删除一个不需要的include。@Casanova-否。这样做并接受这样的答案违反了网站规则。如果你明白我的意思的话,即使没有相互投票,在不同账户下提问和回答也是违反网站规则的精神的。回答你自己的问题并接受这个答案没有什么坏处——虽然我以前也这么做过。这个问题并不是以
作为前缀。它问你为什么要在每个文件的顶部放一个
#