#define __CLIBNS :: std ::在C标准头文件中,例如stdio.h

时间:2014-09-30 06:14:22

标签: 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的代码,该怎么办? 我应该使用类似的宏吗?

3 个答案:

答案 0 :(得分:0)

_CLIBNS不会发生冲突。如果在代码中使用__CLIBNS(两个下划线),则可能遇到问题,但是您已经在做了一些你不应该做的事情。具有两个前导下划线的名称保留给编译器。

答案 1 :(得分:0)

重要的是<stdio.h>非常谨慎地使用保留的标识符用于内部目的,因此它不会与您的任何代码冲突。由于它是出于内部目的,您的代码根本不应该提及宏。因此,这简化了移植。

答案 2 :(得分:0)

简短的回答:你可能不想在gcc中使用armcc的<stdio.h>副本 - 使用gcc(或newlib)。

<stdio.h>被允许使用__CLIBNS,因为它是实施的一部分;作为用户,您不是(除非实现文档另有说明)。在C中没有名称空间,因此__CLIBNS被定义为空。在C ++中,<stdio.h>的大部分内容都在全局命名空间std中 - 但不是预处理器宏(#define s),因为它们不关心命名空间(宏是邪恶的,但历史上必要)。因此<stdio.h>在其宏定义中使用__CLIBNS来确保它必须定义的宏在您使用C ++时引用std命名空间中的内容。