像#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)视为并行指令。 希望这可以帮助。