在GCC,我被允许这样做:
#include <cstdio>
int main() {
printf("foo");
std::printf("bar"); // "correct" way
}
如果我尝试第一个,我有没有办法得到错误/警告?
答案 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支持以这种方式行事。