"boş" makro tanımıC boş makro tanımlarına izin var mı? Nasıl davranırlar?
#define FOO
geçerli Standart C mi varsayalım? Eğer öyleyse, bu tanımdan sonra FOO
nedir?
"boş" makro tanımıC boş makro tanımlarına izin var mı? Nasıl davranırlar?
#define FOO
geçerli Standart C mi varsayalım? Eğer öyleyse, bu tanımdan sonra FOO
nedir?
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.
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.
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
@En daha iyi bir örnek bir başlık koruyucusu gibi "no-effect deyimi ile bildirmeyi tercih ediyorum. Her iki şekilde de, sabit. – Zeta
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
Boş tanımladıktan sonra 'FOO' değerinin ne olduğunu yanıtlamadınız. –
@ user14284 Makroların değerleri yok. Onlar bir belirteç listesine genişler. Bu liste boş olabilir. – melpomene
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
);
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
İş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
Bu boş dizedir ve evet, kabul edilebilir. – nhahtdh
Sadece dikkat çekmek için [işte] (http://stackoverflow.com/q/8592056/557306) boş tanımların ilginç kullanımını içeren başka bir soru. – sidyll