【问题标题】:Where can I include the header file stdio.h in a C program except at the beginning of the program?除了在程序的开头,我在哪里可以在 C 程序中包含头文件 stdio.h?
【发布时间】:2020-11-25 04:36:37
【问题描述】:

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

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

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

【问题讨论】:

    标签: c header-files declaration


    【解决方案1】:

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

    C11§7.1.2 Standard headers ¶4:

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

    文件范围的意思是'不在函数或变量声明内,也不在结构或联合声明内,或在typedef等内。有关正式定义,请参阅C11 §6.2.1 Scopes of identifiers ¶4

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

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

    但是,用户定义的其他标头可以包含在程序员认为合适的任何地方,但受包含的材料留下语法上有效的翻译单元 (TU) 的限制。

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

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

    【讨论】:

      【解决方案2】:

      在程序开始时包含所有头文件是一个好习惯。

      【讨论】:

      • 这个答案是多余的,它没有像其他答案一样考虑到这个例外
      猜你喜欢
      • 2011-03-20
      • 1970-01-01
      • 2012-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-02
      • 1970-01-01
      • 2019-07-16
      相关资源
      最近更新 更多