2014-09-30 79 views
0

我看到下面的定義在ARM編譯器的標準頭文件stdio.h的#define __CLIBNS ::的std ::在C標準的頭文件,如stdio.h中

#undef __CLIBNS 
#ifdef __cplusplus 
    namespace std { 
    #define __CLIBNS ::std:: 
    extern "C" { 
#else /* ndef __cplusplus */ 
    #define __CLIBNS 
#endif /* ndef __cplusplus */ 

這樣做有什麼意義?如果我必須移植在gcc中使用_CLIBNS的代碼,該怎麼辦? 我應該使用類似的宏嗎?

+0

'_CLIBNS'是一個保留的標識符,所以無論誰寫它搞砸了(加上它不會衝突......) – 2014-09-30 07:09:31

+0

這個代碼是從標準頭文件本身,即stdio.h,這個定義爲armcc的__CLIBNS,我需要將使用此宏的代碼移植到另一個編譯器,即gcc,所以我想了解任何等效的編譯器定義是否在gcc – Madhu 2014-09-30 08:35:30

回答

0

_CLIBNS並不衝突。如果你在你的代碼中使用__CLIBNS(兩個下劃線),你可能會遇到問題,但你已經在做一些你不應該做的事情。帶有兩個前導下劃線的名稱是爲編譯器保留的。

+0

由於名稱以下劃線開頭,後跟大寫字母,因此OP有非在他的手上發現。 – 2014-09-30 07:08:54

+0

這段代碼是從標準頭文件本身,即stdio.h,這爲armcc定義了__CLIBNS,我需要將使用此宏的代碼移植到另一個編譯器即gcc,所以我想了解任何等價的編譯器定義在gcc中 – Madhu 2014-09-30 08:36:26

+0

@Madhu如果你的代碼定義了__CLIBNS,那麼它就是非標準的代碼。正確的解決方法是重構代碼以不使用保留名稱。 – Adam 2014-09-30 17:26:42

0

的意義在於,<stdio.h>非常仔細地使用供內部使用保留的標識符,因此它不能與任何代碼的衝突。由於它是爲了內部目的,你的代碼不應該提及宏。因此這簡化了移植。

0

簡短的回答:你可能不希望使用的<stdio.h>器armcc的副本用gcc - 使用gcc(或newlib的)。

<stdio.h>被允許使用__CLIBNS,因爲它是實施的一部分;您作爲用戶不是(除非實現的文檔另有說明)。在C中沒有命名空間,所以__CLIBNS被定義爲空。在C++中大部分的<stdio.h>內容是在全局命名空間std - 但不是預處理宏(#define S),因爲他們不關心命名空間(宏是邪惡的,但歷史的必然)。所以<stdio.h>使用__CLIBNS在它的宏定義,以確保它有宏定義在std命名空間參考的東西,當你使用的是C++。

相關問題