4

#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");
}
4

3 回答 3

6

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

于 2013-05-05T21:53:57.737 回答
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
于 2013-05-05T21:06:16.917 回答
0

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

于 2013-05-05T21:09:20.977 回答