我可以在我的c程序中的任何地方编写预处理程序指令吗?

时间:2017-08-29 20:41:18

标签: c c-preprocessor

是否必须在程序顶部和主函数之外编写#include?

我尝试在main函数中使用#define预处理器并且只有一个例外工作正常..我使用define指令定义的常量只能在#define行之后使用 例如,说printf("%d",PI); #define PI 3.14将给出错误“未定义的符号PI”。但是在下面的代码中我没有遇到任何错误

#define PI 3.14 
printf("%d",PI);

这是因为C是一种过程语言而且过程语言实现了自上而下的方法吗?

另外我想知道我们在主函数或其他预处理程序指令中是否也只能使用#define?如果我们可以使用那些? 或者是另一种方式,而不是#include我们可以使用main函数中的所有预处理器指令?

4 个答案:

答案 0 :(得分:3)

唯一可以放置预处理程序指令的地方是宏扩展。唯一的例外是#pragma,也可以写成_Pragma()

这与"程序"无关,但由于C是根据8个翻译阶段定义的,每个翻译阶段都是" as-if"在下一阶段之前完全完成。有关详细信息,请参阅C11标准的第5.1.1.2节。

在文件启动后使用预处理程序指令有用的一个例子是"X Macro" technique(很多人只知道"那些{{1}文件")。

答案 1 :(得分:1)

预处理程序指令几乎可以在任何地方运行。当然,如果你滥用它,你可以很容易地使你的代码容易混淆。

答案 2 :(得分:1)

预处理器在编译器执行源代码转换为目标代码之前完成其工作。预处理主要是字符串替换任务,因此它可以放在代码中的任何位置。当然,如果生成的扩展在语法上不正确,则扩展的源代码将无法编译。

一种常见的做法是在函数中嵌入条件编译指令,以允许函数使用特定于平台的API。

void some_wrapper_function () {
#if defined(UNIX)
    some_unix_specific_function();
#elif defined(WIN32)
    some_win32_specific_function();
#else
    #error "Compiled on an unsupported platform"
#endif
}

就其性质而言,指令本身通常必须在行的开头定义,而不是在源行中间的某处定义。但是,定义的宏当然可以出现在源代码中的任何位置,并且将根据指令定义的替换规则进行替换。

答案 3 :(得分:0)

这里的诀窍是要意识到#profiles传统上是由预处理器解释的,它在任何编译之前运行。预处理器将生成一个新的源文件,然后进行编译。我不认为任何现代编译器默认以这种方式工作,但适用相同的原则。

所以当你说

#include "foo.h"

你说“从这一行开始,将foo.h的全部内容插入我的源代码中。”

您可以在源文件中的任何位置使用此指令,但在源头以外的任何位置使用它很少有用(并且通常不可读)。