c++ - 我应该在 C++ 程序中包含 <xxxx.h> 或 <cxxxx> 吗?

标签 c++ include c++-faq

  • 我应该在 C++ 程序中包含什么,stdio.hcstdio?为什么?
  • 为什么要两个头文件提供相同的功能?
  • 标准对此有何规定?
  • 我应该如何包含其他此类 header ,是否有我应该遵循的基本规则?

最佳答案

考虑以下程序:

Sample 1:

#include<stdio.h>

int main()
{
    printf("Hello World");
    return 0;
}

Sample 2:

#include<cstdio>

int main()
{
    printf("Hello World");
    return 0;
}

两者都按预期工作。 那么哪种用法更合适? 答案是:没有!感到惊讶?继续阅读。

出于兼容性原因,C++ 标准库提供了所有标准 C 头文件,而 C++ 作为一种语言也提供了所有等效的头文件。作为惯例,

  • 没有 C++ 标准库头文件(除了为了 C 兼容性而包含的头文件)有任何文件扩展名,并且
  • C header 的所有 C++ 等效项均以 cxxxxx 开头.

C++ 标准在附录 D(规范性)兼容性特性中提到了这一点:

Standard Citation

§2 提到了重要的区别点。适用于上述示例的这条规则意味着:

  • 包括 cstdio 会在 std 命名空间中导入符号名称,并在全局命名空间中可能
  • 包含 stdio.h 会在全局命名空间中导入符号名称,在 std 命名空间中可能

让我们将这条规则应用到我们的示例代码中并衡量利弊:

示例 1: 这会将 stdio.h 中的所有符号带入全局命名空间。优点是您可以在没有任何限制的情况下使用这些符号,因为它们是在全局命名空间中导入的。缺点是您最终会用许多您可能永远不会使用的符号名称污染全局 namespace 。这可能会导致符号名称冲突。在 C++ 中,始终将全局命名空间视为雷区,并尽可能避免。

示例 2: 这是一个非常糟糕的做法,因为不能保证实现会将符号放在全局命名空间中,标准根本不要求这样做。我们只是依赖于一种特定编译器实现的行为。我们不能也不应该假设所有编译器都会这样做。所以严格来说,该程序未经标准批准,并且这种用法不能在所有实现中移植。

那么正确的用法是什么?

正确的用法是使用cstdio并完全限定符号名称,或者使用 using declarations 将它们带入范围。这保证了我们使用的所有符号都存在于 std 中。命名空间,我们不会污染全局命名空间。正确用法示例:

Sample 3:

#include<cstdio>

using std::printf;

int main()
{
    printf("Hello World");
    return 0;
}

注意指令 using namespace std; , especially in a header, is not a good option你应该总是使用using声明。

请注意,我们考虑 stdio.hcstdio这里只是一个示例用例,实际上它适用于 all 大多数 cxxxxxxxx.h header ,except a few like <math.h> and <cmath> .

关于c++ - 我应该在 C++ 程序中包含 <xxxx.h> 或 <cxxxx> 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13889467/

相关文章:

c++ - ffmpeg 包含问题 - 缺少某些功能

c++ - 为什么 `include <iostream>` 最终包含这么多*文件?

c++ - 什么是奇怪的重复模板模式 (CRTP)?

c++ - C++ 中 main 的正确声明是什么?

c++ - g++中的线程?

c++ - 在C++中调用重写的方法后得到错误的输出

Mysql 根据国家/地区排除和包含

c++ - 我应该在 C++ 中使用什么 XML 解析器?

c++ - 如何在 QGraphicsWidget 中设置 Qwidget?

c++ - 为什么 std::logic_error 实际上不是从 std::exception 继承的?