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

时间:2013-05-05 21:03:35

标签: c include c-preprocessor pragma preprocessor-directive

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

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

#include<stdio.h>

此外,这里有一本书的摘录。作者对SO的评价不好,尤其是他对void main()的慷慨使用,但我觉得没有作者可以 无理由声称以下内容:

  

这些预处理程序指令中的每一个都以#开头   符号。指令可以放在程序的任何地方但是   通常放在节目的开头,在节目开始之前   第一个功能定义。

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

编辑 OUAH 的评论之后,我尝试了以下操作,但它没有发出警告,它提供了大量错误 .LOL。

int main(void)
{
    #include<stdio.h>
    printf("Trial");
}

3 个答案:

答案 0 :(得分:5)

#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

答案 1 :(得分:5)

这样想。包含文件的内容只是插入到#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代码。

答案 2 :(得分:0)

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