2011-05-25 26 views
3

我知道以下3個部分#define只有2部分時,#define的含義是什麼?

#define PI 3.4 

這意味着它將與3.4取代PI

但是,這2份#define這樣的意思:

#define something 

將它替換something與空/空字符串?

以下是代碼示例,我搜索的文件,只列出了相關的線

D:\mariadb\storage\pbxt\src\cache_xt.cc (23 hits) 
    Line 172: #ifdef xtPublic 
    Line 173: #undef xtPublic 
    Line 188: #define xtPublic 
    Line 325: xtPublic XTIndHandlePtr xt_ind_get_handle(..) 
    Line 378: xtPublic void xt_ind_release_handle(XTIndHandlePtr..) 
    Line 516: xtPublic xtBool xt_ind_copy_on_write(XTIndReferencePtr iref) 
    Line 597: xtPublic void xt_ind_lock_handle(XTIndHandlePtr handle) 
+5

這裏沒有真正的相關性,但將PI定義爲3.4是一個可怕的近似值。 :) – ereOn 2011-05-25 09:12:40

+0

謝謝,只是一個例子,但一個不好的例子:) – 2011-05-26 00:45:29

回答

14

是的,它意味着一個空字符串替換something。但現在最重要的是something由它「定義」預處理器識別,所以

#ifdef something 

#define(線172)後會通過。

此外,常見的是使用它的構型或供應商特定的屬性(325行,...),像

#if MSVC 
#define EXPORT __declspec(dllexport) 
#else 
#define EXPORT 
#endif 

EXPORT void f(); 
// expand to '__declspec(dllexport) void f()' in MSVC 
// expand to 'void f()' in other compilers 
1

這些聲明通常頭文件內給予,作爲防止的手段雙重包含相同的文件。這些也被稱爲include guards

1

#define something將導致剛剛定義的內容。它不會導致編譯器錯誤。它通常用於像

void getValue(IN int& x, OUT int& y)。如果你#define IN and #define OUT it will not give a compiler error and anybody will get to know x is input and y is output

還有一個用途是像

#ifndef __ABC_H__ 
#define __ABC_H__ 

... 

#endif 

這是爲了防止對如重新加入。 「abc.h」

+0

當然,我們不敢真正使用'__ABC_H__'作爲標識符,因爲[它是保留](http://stackoverflow.com/questions/) 228783 /什麼-是最規則約-使用-AN-下劃線在-AC-標識符)。 – GManNickG 2011-05-25 09:10:24

1

它只不過是預處理器指令,#define只是將Header文件指向考慮的庫文件或者可以聲明常量。

1

是的,它用空字符串替換預處理器。它有助於在不編寫冗長的評論的情況下自行記錄代碼。

相關問題