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

在C程序中,除了在程序的开头,我在哪里可以包含头文件stdio.h?,c,header-files,declaration,C,Header Files,Declaration,在C程序中,可以在哪些有效位置包含头文件#include 我的意思是,一般来说,我们在C程序的开头包含头文件,但是如果在使用任何printf或fprintf函数之前将其包含在main()函数中,它会给出与之前相同的结果还是会给出任何错误 此外,如果这样的声明工作正常,那么除了在程序开始时,我还可以在哪些地方声明此头文件?标准C头文件必须包含在任何函数或声明之外-在文件范围内。否则,在使用它们的内容之前,只需要包含它们 C11: 标准标题可以按任何顺序包含;在一个给定的范围内,每一个都可以包含多次

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

我的意思是,一般来说,我们在C程序的开头包含头文件,但是如果在使用任何
printf
fprintf
函数之前将其包含在
main()
函数中,它会给出与之前相同的结果还是会给出任何错误


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

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

C11:

标准标题可以按任何顺序包含;在一个给定的范围内,每一个都可以包含多次,除了包含
的效果外,与只包含一次没有区别:

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

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

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

例如,在一个TU中经常包含一个页眉,每次都有不同的效果,而<>代码>包含在一个变量的初始化器的中间(如果是X宏,它通常是预期的用法)。

static struct which data[]=
{
//#包括//不正确
#包括“xmacro.h”//可能正确
};

最好在程序开始时包含所有头文件。

这个答案是多余的,它没有像其他答案一样考虑例外情况
static struct WhatEver data[] =
{
// #include <stdio.h>  // Incorrect
#include "xmacro.h"    // Possibly correct
};