为什么有时在代码块中编写include语句是有效的?

为什么有时在代码块中编写include语句是有效的?,c,include,C,Include,我来自python背景,以下内容有效: def f(): import someLibrary someLibrary.libraryFunction() 当我需要调试C代码时,我在函数的中间写下: void f(int param) { int status; /* other code */ #include <stdio.h> printf("status: %d", status); /* more code

我来自python背景,以下内容有效:

def f():
    import someLibrary
    someLibrary.libraryFunction()
当我需要调试C代码时,我在函数的中间写下:

void f(int param)
{
     int status;
     /* other code */
     #include <stdio.h>
     printf("status: %d", status);
     /* more code */
}
void f(int参数)
{
智力状态;
/*其他代码*/
#包括
printf(“状态:%d”,状态);
/*更多代码*/
}
它按照我的预期编译和运行。后来有人向我指出,这不应该编译,因为C预处理器实际上用stdio.h`的内容替换了
#include~语句。
那么为什么这个代码是有效的呢

有人向我指出,这不应该编译,因为C预处理器实际上用dio.h的内容替换了#include语句

这方面的逻辑没有道理。前处理器从
stdio.h
文件插入文本并不意味着它不应该编译。如果该文件中没有任何内容会导致编译错误,那么它可以正常编译

此外,标头中通常有一个多包含保护。因此,如果他们之前已经被包括在内,任何进一步的尝试都没有效果。在这种情况下,如果
先前已包含在文件中(直接或间接),则
#include
将无效

话虽如此,但不要这样做。在C语言中,在函数范围内不应包含标准头

有人向我指出,这不应该编译,因为C预处理器实际上用dio.h的内容替换了#include语句

这方面的逻辑没有道理。前处理器从
stdio.h
文件插入文本并不意味着它不应该编译。如果该文件中没有任何内容会导致编译错误,那么它可以正常编译

此外,标头中通常有一个多包含保护。因此,如果他们之前已经被包括在内,任何进一步的尝试都没有效果。在这种情况下,如果
先前已包含在文件中(直接或间接),则
#include
将无效


话虽如此,但不要这样做。在C中,标准头不应该包含在函数范围内。

是的,C和Python在这方面有很大的不同

在编译之前,预处理器用包含文件的内容替换
#include
指令是正确的

它是否会导致编译错误完全取决于所包含文件的内容。像
stdio.h
这样的标准头不包含任何可执行语句-它们只包含typdef、函数声明、其他宏等内容。它们通常还具有某种
#include
保护,防止每个翻译单元多次加载它们(也就是说,如果您
#包含一个包含
stdio.h
的文件,然后
#直接包含在同一个源文件中,
stdio.h
的内容将只加载一次)

理论上,在代码中随机添加
stdio.h
是没有问题的,但它可能会导致问题。在这种情况下,所有
stdio.h
的内容只对
f
的主体可见-如果只有
f
需要使用
stdio.h
中的任何内容,这不是问题,否则它会导致问题头痛


标准头最好包含在源文件的开头。

是的,C和Python在这方面有很大的不同

在编译之前,预处理器用包含文件的内容替换
#include
指令是正确的

它是否会导致编译错误完全取决于所包含文件的内容。像
stdio.h
这样的标准头不包含任何可执行语句-它们只包含typdef、函数声明、其他宏等内容。它们通常还具有某种
#include
保护至少应防止每个翻译单元多次加载它们(即,如果您
#包含
一个包含
stdio.h
的文件,然后将
#包含
直接加载到同一源文件中,
stdio.h
的内容将只加载一次)

理论上,在代码中随机添加
stdio.h
是没有问题的,但它可能会导致问题。在这种情况下,所有
stdio.h
的内容只对
f
的主体可见-如果只有
f
需要使用
stdio.h
中的任何内容,这不是问题,否则它会导致问题头痛


标准头文件最好包含在源文件的开头。

头文件通常包含声明。因此代码可以编译,但意义不大。:)此外,由于头保护,如果上面已经包含了头文件,编译器将不包含头文件。当您
包含
某些内容时,这与将文件内容复制并粘贴到此位置完全相同。因此,这些内容可能会也可能不会使最终结果可编译。
#include someLibrary
在Python中不会做任何有用的事情,因为它只是一个注释。你的意思是导入一些库吗?这与预处理器
#include
directive.FYI完全不同,尽管它可能不会出现编译器错误,如中所述,它违反了C 2018 7.1.2 4:“…如果使用,[标准库]头应包含在任何外部声明或定义之外,…”头文件通常包含声明。因此,代码可以编译,但意义不大。:)此外,由于头保护,编译器将不包含头