C++ 在C标准头文件(如stdio.h)中定义_uclibns::std::

C++ 在C标准头文件(如stdio.h)中定义_uclibns::std::,c++,arm,C++,Arm,我在ARM编译器的标准头文件stdio.h中看到了以下定义: #undef __CLIBNS #ifdef __cplusplus namespace std { #define __CLIBNS ::std:: extern "C" { #else /* ndef __cplusplus */ #define __CLIBNS #endif /* ndef __cplusplus */ 这有什么意义?如果我必须移植在gcc中使用_CLIBNS的代码怎么办? 我是否应该使用

我在ARM编译器的标准头文件stdio.h中看到了以下定义:

#undef __CLIBNS
#ifdef __cplusplus
  namespace std {
  #define __CLIBNS ::std::
    extern "C" {
#else /* ndef __cplusplus */
  #define __CLIBNS
#endif /* ndef __cplusplus */
这有什么意义?如果我必须移植在gcc中使用_CLIBNS的代码怎么办?
我是否应该使用类似的宏?

\u CLIBNS不冲突。如果在代码中使用_CLIBNS两个下划线,您可能会遇到问题,但您已经在做一些不应该做的事情。带有两个前导下划线的名称是为编译器保留的。

重要的是,在内部使用保留标识符时要非常小心,这样就不会与任何代码冲突。因为它是用于内部目的,所以代码根本不应该提到宏。因此,这简化了移植。

简短回答:您可能不想将armcc的副本与gcc一起使用-使用gcc或newlib


允许使用_CLIBNS,因为它是实现的一部分;作为用户,除非实现的文档告诉您其他情况,否则您不会被拒绝。在C语言中没有名称空间,因此_CLIBNS被定义为空。在C++中,大多数内容都在全局命名空间STD中,但不是预处理器宏定义的,因为它们不关心名称空间宏是邪恶的,但在历史上是必要的。因此,在宏定义中使用了γ-clibn,以确保宏必须定义的是指在使用C++时,在STD命名空间中的东西。

是从下划线开始的,后面是大写字母,所以OP在他的手上没有问题。这个代码来自标准的头文件本身,即STDIO。这为armcc定义了_uclibns,我需要将使用此宏的代码移植到另一个编译器ie gcc,所以我想了解其中的任何等效编译器定义gcc@Madhu如果您的代码定义了_CLIBNS,那么它是非标准代码。正确的修复方法是重构代码,使其不使用保留名称。_CLIBNS是一个保留标识符,因此无论是谁编写的都会出错,而且不会发生冲突…此代码来自标准头文件本身,即stdio.h,它为armcc定义了_CLIBNS,我需要将使用此宏的代码移植到另一个编译器ie gcc,所以我想了解gcc中存在的任何等价编译器定义