是否有一种方法可以禁用C头文件中的全局标识符
Is there a way to disable global identifiers in C headers?
在GCC中我可以这样做:
#include <cstdio>
int main() {
printf("foo");
std::printf("bar"); // "correct" way
}
有一种方法,我可以得到一个错误/警告,如果我尝试第一个?
不,这就是cstdio
的工作方式。按你想要的方式去做是违反标准的。
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应该是这样的
相关文章:
- 在头文件中使用opencv类型来实现未定义的标识符
- 我收到未声明的标识符错误,但我已包含头文件?
- 未定义的标识符 - 缺少哪些头文件?- DX12.
- 文本文件中的匹配行与启动标识符
- 如何修复(“矢量”:未声明的标识符)在我的头文件中
- 在开关盒循环中使用未删除的标识符来解析 CSV 文件
- 预处理器指令:为什么使用#Define的标题文件标识符与标头文件名不同
- 标识符未定义 C++ 即使我有 CPP 和头文件
- OpenCV 标识符"Mat"在头文件中使用时未定义
- 错误:'cout':未声明的标识符;虽然我已经在程序中包含了iostream头文件
- 错误:标识符类名未定义?为我在文件中创建的所有类获取此内容
- C++错误代码 C2065:"<类名>"未声明的标识符,即使它应该在另一个 .h 文件中声明
- C++自定义头文件 - 语法错误 C2061:标识符
- 不同文件中同一命名空间中的 2 个不同枚举中的相同标识符
- 计算文本文件中的整数数(使用 fin>>x 的未声明标识符)
- 头文件看不到其他头标识符
- 在头文件(Clang)中使用未声明的标识符
- 如何在C++文件中声明标识符JSON
- 直接 X 11 纹理 FX 文件错误 X3004 未声明标识符"input"
- 当函数在cpp文件中时,未声明的标识符