C99'daki değişken makrolar için boş bağımsız değişkenlerle ilgili iyi bilinen bir sorun var.
misal:
#define FOO(...) printf(__VA_ARGS__)
#define BAR(fmt, ...) printf(fmt, __VA_ARGS__)
FOO("this works fine");
BAR("this breaks!");
Yukarıdakilerin kullanımı BAR()
, C99 standardına göre gerçekten yanlıştır, çünkü aşağıdakilere genişleyecektir:
printf("this breaks!",);
Sondaki virgülü not edin - çalışmaz.
Bazı derleyiciler (örneğin: Visual Studio 2010) sizin için sondaki virgülden sessizce kurtulacaktır. Diğer derleyiciler (örneğin: GCC) aşağıdakilerin ##
önüne koymayı destekler __VA_ARGS__
:
#define BAR(fmt, ...) printf(fmt, ##__VA_ARGS__)
Ancak bu davranışı elde etmenin standartlara uygun bir yolu var mı? Belki birden çok makro kullanıyor musunuz?
Şu anda, ##
sürüm oldukça iyi destekleniyor gibi görünüyor (en azından benim platformlarımda), ancak gerçekten standartlara uygun bir çözüm kullanmayı tercih ederim.
Önleyici: Küçük bir fonksiyon yazabileceğimi biliyorum. Bunu makro kullanarak yapmaya çalışıyorum.
Düzenleme : BAR () neden kullanmak istediğime dair bir örnek (basit olsa da):
#define BAR(fmt, ...) printf(fmt "\n", ##__VA_ARGS__)
BAR("here is a log message");
BAR("here is a log message with a param: %d", 42);
Bu fmt
, her zaman çift tırnaklı bir C-dizesi olduğunu varsayarak , BAR () günlük ifadelerime otomatik olarak bir satırsonu ekler . Yeni satırı ayrı bir printf () olarak YAZDIRMAZ; bu, günlük kaydı satır arabelleğe alınmışsa ve birden çok kaynaktan eşzamansız olarak geliyorsa avantajlıdır.
BAR
yerine kullanasınızFOO
?