像#include这样的预处理器指令是否只能放在程序代码的顶部?

我在函数内部使用了#pragma指令,没有错误或警告(特别是#pragma pack() )。但是下面的代码显示了incompatible implicit declaration of built-in function 'printf'|的警告incompatible implicit declaration of built-in function 'printf'|

 int main(void) { printf("Trial"); } #include 

此外,这里是我所拥有的一本书的摘录。作者对SO的评价很差,特别是对于他对void main()慷慨使用,但我觉得没有作者可以如此不好地声称以下内容:

这些预处理程序指令中的每一个都以#符号开头。 指令可以放在程序的任何位置,但通常放在程序的开头,在第一个函数定义之前。

那么你能否告诉我是否必须在程序的顶部使用#include之类的预处理程序指令,而其他像#pragma这样的程序可以在程序的任何地方使用?

编辑OUAH的评论之后我尝试了以下内容,但它没有发出警告,它给出了一大堆错误 .LOL。

 int main(void) { #include printf("Trial"); } 

#include指令可以放在源文件的任何位置,但在C中,标识符在声明之前通常不能使用。 这就是你将#include指令放在源文件开头的原因。

 void foo(void) { printf("Hello world\n"); } extern int printf(const char *, ...); // Error, the declaration should be put // before the actual call 

这样想吧。 包含文件的内容只是插入到#include指令出现的文件中。 生成的代码需要在语法上对您编程的语言更正。

配置以下文件:

 int a; int foo(); int main() #include "myheader.h" int foo() { return 0; } 

文件myheader.h包含:

 { return foo(); } 

编译器在预处理器处理完#include指令后将看到的代码是:

 int a; int foo(); int main() { return foo(); } int foo() { return 0; } 

这是有效的C语法。 建议不要使用#include指令,但它可以让您了解它的含义。 如果myheader.h文件具有以下内容:

 this is some garbage which is not proper C 

然后生成的代码将是:

 int a; int foo(); int main() this is some garbage which is not proper C int foo() { return 0; } 

您可以在文件中的任何位置使用#include。 它导致在该点包含所包含文件的内容。 您在代码中获得printf()的未声明消息的原因是C要求在使用之前声明函数,并且stdio.h具有该声明。 这就是为什么它需要在它使用之前。 为什么它不能包含在后一个例子中的main()中是因为在包含(扩展)时,它会导致语法错误的C代码。

“#pragma”指令将被C编译器忽略,因为它将带有“#”标记的行视为注释。 看起来你正在使用openmp。 OpenMP编译器将这些(#pragma)视为并行指令。 希望这可以帮助。