在C程序中,除了程序的开头,哪里可以包含头文件stdio.h



在C程序中,哪些有效位置可以包含头文件#include <stdio.h>

我的意思是,通常,我们在C程序的开头包含头文件,但如果在使用任何printffprintf函数之前,我将其包含在main()函数中,它会给出与以前相同的结果吗?还是会给出任何错误?

此外,如果这样的声明工作正常,那么除了在程序开始时,我还可以在哪些地方声明这个头文件?

标准的C头必须包含在任何函数或声明之外——在文件范围内。否则,只需要在使用它们的内容之前将它们包括在内。

C11§7.1.2标准标题¶4:

标准标头可以包含在任何顺序中;在给定的范围内,每一个都可以包含不止一次,除了包含<assert.h>的效果取决于NDEBUG的定义(见7.2(之外,没有什么不同于只包含一次的效果。如果使用,则应在任何外部声明或定义之外包含一个标头,并且应首先将其包含在对其声明的任何函数或对象的第一次引用之前,或者它定义的任何类型或宏。然而,如果标识符被声明或定义在一个以上的报头中,则第二个和随后的相关联的报头可以被包括在对标识符的初始引用之后。程序中不应有任何宏,其名称在词汇上与包含标题之前或扩展标题中定义的任何宏时当前定义的关键字相同。

文件范围表示"不在函数或变量声明内,也不在结构或联合声明内,或typedef内,等等。有关正式定义,请参见C11§6.2.1标识符范围¶4:

…如果声明标识符的声明符或类型说明符出现在任何块或参数列表之外,则标识符具有文件作用域,终止于转换单元的末尾…

请注意,POSIX等标准中的其他标头通常会对它们的包含位置施加类似的规则——它们必须包含在文件范围内。

然而,用户定义的其他标题可以包含在程序员认为合适的地方,但所包含的材料必须留下语法有效的翻译单元(TU(。

例如;X-Macros";这通常涉及在单个TU中多次包含头部,每次都具有不同的效果,并且如果#include行是预期用途,则它可以出现在变量的初始值设定项的中间(对于X-Macros,它通常是预期用途(。

static struct WhatEver data[] =
{
// #include <stdio.h>  // Incorrect
#include "xmacro.h"    // Possibly correct
};

在程序开始时包含所有头文件是一种很好的做法。

最新更新