2012-12-15 19 views

cevap

38

Bu, basitçe hiçbir şeye genişleyen bir makrodur. Ancak, artık makro tanımlanmışsa, #if defined (veya #ifdef) ile tanımlanmış olup olmadığını kontrol edebilirsiniz.

: Bu sizin yayın sürümünde göstermek istemediğiniz örnek ek ayıklama bilgi için, çok kullanışlı oluyor

int main(){ 

    printf("Hello world"); 
} 

belirli durumlar vardır için

#define FOO 

int main(){ 
    FOO FOO FOO 
    printf("Hello world"); 
} 

genişleyecektir

/* Defined only during debug compilations: */ 
#define CONFIG_USE_DEBUG_MESSAGES 

#ifdef CONFIG_USE_DEBUG_MESSAGES 
#define DEBUG_MSG(x) print(x) 
#else 
#define DEBUG_MSG(x) do {} while(0) 
#endif 

int main(){ 
    DEBUG_MSG("Entering main"); 
    /* ... */ 
} 

CONFIG_USE_DEBUG_MESSAGES makro tanımlandığı için, DEBUG_MSG(x)print(x)'a genişler vealırsınız 10 #define, DEBUG_MSG(x) boş bir do - while döngüsünü genişletir ve iletiyi görmezsiniz. Boş makro tanımları, kendini belgelemek için de kullanılabilir.

+1

Bu çok risklidir, çünkü derlemeyi özellikle bozabilir. “Eğer” (x) DEBUG_MSG ("test") gibi ifadeleriniz olduğunda; else DEBUG_MSG ("test"); '' '. Boş makroyu, "#define DEBUG_MSG (x) do {} iken" – Ely

+0

@En daha iyi bir örnek bir başlık koruyucusu gibi "no-effect deyimi ile bildirmeyi tercih ediyorum. Her iki şekilde de, sabit. – Zeta

15

Evet, boş tanımlamaya standart izin verilir.

C11 (n1570), 6.10 Ön işleme direktifleri

control-line: 
    # define identifier replacement-list new-line 
    # define identifier lparen identifier-list(opt)) replacement-list new-line 
    # define identifier lparen ...) replacement-list new-line 
    # define identifier lparen identifier-list , ...) replacement-list new-line 
replacement-list: 
    pp-tokens(opt) 

ortak kullanım içerme korumalar §.

#ifndef F_H 
# define F_H 

#endif 
+0

Boş tanımladıktan sonra 'FOO' değerinin ne olduğunu yanıtlamadınız. –

+3

@ user14284 Makroların değerleri yok. Onlar bir belirteç listesine genişler. Bu liste boş olabilir. – melpomene

1

Aşağıdaki kod snippet'inin IN bir örneğidir. Kod ve yorum hem EDK II project'dan alınmıştır.

// 
// Modifiers for Data Types used to self document code. 
// This concept is borrowed for UEFI specification. 
// 

/// 
/// Datum is passed to the function. 
/// 
#define IN 


typedef 
EFI_STATUS 
(EFIAPI *EFI_BLOCK_RESET)(
    IN EFI_BLOCK_IO_PROTOCOL   *This, 
    IN BOOLEAN      ExtendedVerification 
); 
+0

Başka bir örnek kullanırdım. Gerçek koddan bir alıntı olmak zorunda değildir, ancak mevcut örnekte oldukça fazla miktarda gereksiz bilgi bulunmaktadır. (Bu arada, cevabınızın hala orijinal soruya cevap verdiğinden, diğer cevaplarla iyi çalıştığından emin olun, ama tek başına bir cevap olarak, "FOO'nun" ne anlama geliyor? "Sorusuna tam olarak uymuyor. – Zeta

+0

İşaretlediğiniz için teşekkürler. Bu soruyu gördüğümde bu kod parçasını okuyorum. Cevap uzun süredir seçildiğinden, cevabımın bazı eğitici referanslar olarak hizmet verebileceğini umuyorum. – smwikipedia

İlgili konular