有没有办法在C头中禁用全局标识符?

时间:2011-11-09 05:55:15

标签: c++ gcc namespaces

在GCC,我被允许这样做:

#include <cstdio>

int main() {
  printf("foo");
  std::printf("bar"); // "correct" way
}

如果我尝试第一个,我有没有办法得到错误/警告?

3 个答案:

答案 0 :(得分:1)

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

在C ++中很难说std::printf 正确。使用std::cout正确的方法。

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

由于您已编写程序NO,因此无法获得警告/错误,因为cstdio应该将std :: printf暴露出来,以便可以在没有命名空间限定符的情况下使用它。它具有专门定义的using指令,允许使用std :: namespace函数而不会产生错误。

具体而言cstdio包含:

namespace std
{
  using ::FILE;
  using ::fpos_t;

  using ::clearerr;
  using ::fclose;
 ...
}

请注意,这是标准的一部分... cstdio支持以这种方式行事。