是否有一种方法可以禁用C头文件中的全局标识符

Is there a way to disable global identifiers in C headers?

本文关键字:文件 标识符 全局 方法 一种 是否      更新时间:2023-10-16

在GCC中我可以这样做:

#include <cstdio>
int main() {
  printf("foo");
  std::printf("bar"); // "correct" way
}

有一种方法,我可以得到一个错误/警告,如果我尝试第一个?

不,这就是cstdio的工作方式。按你想要的方式去做是违反标准的。

在c++中很难论证std::printf正确的。使用std::cout正确的方法来做到这一点。

Update正如其他人指出的那样,标准只要求在std命名空间中声明函数。允许实现在全局命名空间中另外定义它们。

printf<stdio.h>extern "C"函数(一个标准的C头文件),它包含在<cstdio>中,但std::printf是一个c++的东西。使用std::ostream标准c++类对std::cout进行c++输出通常更好。我不知道在使用<stdio.h>函数时获得警告的方法,但如果这对您真的很重要,您可以考虑使用例如GCC MELT扩展来定制您的GCC编译器。对于以前从未做过的人来说,定制GCC可能需要一周或更长时间的努力(因为您需要了解一些GCC的内部表示)。

当您编写程序时,您不会得到警告/错误,因为cstdio应该公开std::printf out,以便可以在没有名称空间限定符的情况下使用它。它有专门定义的using指令,允许使用std:: namespace函数而不会产生错误。

特别是cstdio包含:

namespace std
{
  using ::FILE;
  using ::fpos_t;
  using ::clearerr;
  using ::fclose;
 ...
}

注意这是标准的一部分…cstdio应该是这样的