2012-06-11 21 views
7

Olası Çoğalt:
How to make a variadic macro (variable number of arguments)Tanımlanmamış sayıda parametre kabul eden bir C makrosuna sahip olabilir miyim?

Ben printf benzer argümanları kabul eder ve bunları kaydeder temel C bir günlük makro olmasını istiyorum. Ancak, bu (vb stderr vs, dosyayı seviyesini log) bir şey derleme zamanında ayarlanması açmış nasıl istiyorum, değil çalışma zamanı; Hiçbir şey yapmayan ve düşük seviyeli günlüğe kaydetmeyi göz ardı etmek için parametreleri ayarlıyorumsa, umarım kodun en iyisi haline getirilmiş olması ile.

Şimdiye kadar derleme zamanında tanımlanan bir parametre dışına göre tanımlanmış bir makro var. Parametre günlüğü benim günlük yöntemine gider tanımlanırsa, aksi takdirde stderr gider (dosyalara giriş yapmak için). Ancak, yalnızca bu makroya bir dize iletebilirim. Günlük metodu belirsiz sayıda argüman alabilir ve printf sözdizimini kullanarak çalışır. Makroyu ayarlamak için bir yol olup olmadığını bilmek istiyorum, böylece günlük dosyasına belirsiz sayıda argüman iletecek mi?

Ve cevap Temel C istediğimi elde etme başka bir yöntem (I C++ veya boost kullanamazsınız) olduğunu yapamaz şüpheli beri.

cevap

7

C99 bağımsız değişken bir dizi kabul edebilir makro var. Onlar variadic makro denir.

http://gcc.gnu.org/onlinedocs/cpp/Variadic-Macros.html

Örnek:

Evet yapabilirsiniz
#define eprintf(...) fprintf (stderr, __VA_ARGS__) 
#define dfprintf(stream, ...) fprintf(stream, "DEBUG: " __VA_ARGS__) 
2

. C99 bu out of the box'u destekler.

#define debug(format, ...) fprintf (stderr, format, ## __VA_ARGS__)

0

Bkz Q10.26 comp.lang.c SSS bölümünden:

sözdizimi benziyor Bir değişken sayı alır bir makro tanımlamak üç nokta kullanabilirsiniz

İlgili konular