c++ - 为什么在 C++ 中使用 <cstdio> 而不是 <stdio.h> 时 "std::printf"和 "printf"都会编译?

标签 c++ namespaces header-files

<分区>

据我所知,cxyz 格式的 header 与 xyz.h 相同,唯一的区别是 cxyz 将所有命名空间 std 下的 xyz.h 的内容。为什么以下程序在 GCC 4.9 和 clang 6.0 上都能编译?

#include <cstdio>

int main() {
    printf("Testing...");
    return 0;
}

和第二个程序:

#include <cstdio>

int main() {
    std::printf("Testing...");
    return 0;
}

FILE 结构也是如此:

FILE* test = fopen("test.txt", "w");

std::FILE* test = std::fopen("test.txt", "w");

两者都有效。

直到现在,我一直认为最好使用 cstdiocstring 等,而不是它们的非命名空间对应物。但是,以下两个程序中哪个是更好的做法?

其他 C 函数也是如此,例如 memset(来自 cstring)、scanf(也来自 cstdio)等。

(我知道有些人会问为什么我在 C++ 程序中使用 C IO;这里的问题不是特定的 C IO,而是这段代码是否应该编译而不特别指定 std:: 在调用命名空间 C 函数之前。)

最佳答案

该标准还允许编译器将名称注入(inject)全局命名空间。

这样做的一个原因是它允许执行 <cstdio>成为:

#include <stdio.h>

namespace std
{
    using ::printf;
    using ::fopen;
    // etc.
}

因此编译器/库供应商不必编写和维护那么多代码。

在您自己的代码中,始终使用 std::using namespace std;等,以便您的代码可移植到不将名称注入(inject)全局命名空间的编译器。

关于c++ - 为什么在 C++ 中使用 <cstdio> 而不是 <stdio.h> 时 "std::printf"和 "printf"都会编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28227006/

相关文章:

xml - XSLT 删除空白命名空间而不将元素分配给不同的或默认命名空间

c++ - 为什么 C++ 头函数放在一个单独的文件中?

c++ - 我可以在 C++ 的头文件中放置一个内联函数吗?

c++ - C++头文件的组织

c++ - 用于保护 PDF 不被复制、编辑和打印(不是查看)的密码库

r - 使用 NAMESPACE 导入/导出包

c++ - 在模板类之外定义友元函数的正确方法是什么?

.net - 不改变 "http://tempuri.org/"引用是否只是缺乏专业精神或更多?

c++ - 如何访问 USB 电视调谐卡等 BDA 设备

c++ - 将 Apache ActiveMQ 与 C/C++ 结合使用