2012-06-12 87 views
2

我正在開發符合ANSI標準的編譯器(Microchip XC8)上的PIC MCU程序。 有兩種操作模式,在編譯期間通過宏來確定。 所以,我不想重複一個函數宏由於一行代碼,我想知道是否有任何的方式來編寫一個宏如宏中的雙斜槓註釋替換

#define FOO // 

,這樣,當FOO是取代它實際上會取消該行的其餘部分。

寫一個函數而不是一個宏是不可能的,因爲函數調用產生的延遲會破壞我的程序的緊時序(大約幾微秒)。

+0

如果真有這樣的一種方式,編譯器會抱怨無效的令牌'/ /'。 –

+0

這不能回答你的問題,但是你有沒有試過編寫一個函數並強制你的編譯器使用合適的編譯器特定符號來內聯它? –

+0

@SteveJessop我承認我完全不知道如何做到這一點。 你能給我一些建議嗎? –

回答

3

在發生宏替換之前,從源中刪除了註釋,因此無法完全像這樣定義宏。但是,可以將其他參數傳遞給宏以指定應該生成哪些代碼,或者根據您正在編譯的模式有條件地定義宏。

+0

問題在於FOO實際上是一個類似於對象的宏,我將它傳遞給類似於函數的宏,該宏在其他類似函數的宏中和外部都使用。因此,任何有條件的定義都要求我僅僅因爲一行而複製整個outtermost函數式的宏。而程序空間是寶貴的。 –

+0

具有足夠的間接性,不需要重複的代碼。但是,如果沒有你正在處理的問題的明確例子,我不知道該推薦什麼。你能提供一個宏定義的例子,以及它們是如何使用的? –

5

可以使用#ifndef指令來達到同樣的效果:

#ifndef FOO 
    your_line_of_code 
#endif 

編輯:@SteveJessop讓我看,我也沒注意這句話的OP 的「我不知道由於一行代碼「」,希望複製一個類似功能的宏。以下是可以在這種情況下進行,如果複製函數宏不想要的東西:

// When FOO is defined, BLA in FUNC macro is a no-operation (null statement) 

#ifndef FOO 
#define BLA() a++ 
#else 
#define BLA() 
#endif 

#define FUNC() \ 
    BLA();  \ 
    b++; 
+0

當'your_line_of_code'出現在類似函數宏的定義中時,不會出現。 (問題者說,「我不想複製一個函數式的宏,由於一行代碼」) –

+0

@SteveJessop同意我沒有注意到這句話。我添加了一個編輯。 – ouah

+0

@SteveJessop好吧,順便說一句,我也沒有注意到你在此期間回答了類似的問題:) – ouah

1
#define FOO(...) __VA_ARGS__ 

然後在宏中使用FOO(your code here)代替FOO your code here

如果您的平臺沒有C99,你可以改用

#define FOO(x) x 

和公正,確保參數不包含,不包含在()

5

您無法進行宏展開以註釋掉該行,否。宏定義中的//是定義後面的註釋,它沒有擴展,並且IIRC有一條規則說您不能使用令牌粘貼來構造//。即使可以,擴展它並不意味着宏開始發表評論。基本上,你不能使用宏來改變註釋語法。

你可以這樣做:

#if DO_NOTHING_MODE 
    #define FOO(ARG1) 
#else 
    #define FOO(ARG1) ARG1 
#endif 

,並用它喜歡:

#define FUNCTION_LIKE_MACRO(ARG1, ARG2) \ 
    required line; \ 
    FOO(optional line;) \ 

雖然更常見的成語是設計宏接受一個表達式作爲其參數,而不是整條生產線:

#if DO_NOTHING_MODE 
    #define FOO(ARG1) ((void)0) 
#else 
    #define FOO(ARG1) (ARG1) 
#endif 

,並使用它像FOO(optional line);

無論哪種方式,如果宏參數中有逗號,則調用者需要將它們用括號FOO((1,2)),雖然在C99就可以避免通過使FOO一個可變參數宏:

#define FOO(...) (__VA_ARGS__) 
相關問題