我在ARM编译器的标准头文件stdio.h
中看到以下定义:
#undef __CLIBNS
#ifdef __cplusplus
namespace std {
#define __CLIBNS ::std::
extern "C" {
#else /* ndef __cplusplus */
#define __CLIBNS
#endif /* ndef __cplusplus */
这有什么意义?如果我必须在gcc中移植使用_CLIBNS
的代码,该怎么办?
我应该使用类似的宏吗?
答案 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
命名空间中的内容。