2009-08-10 12 views
14

Oldukça az sayıda oluşturulmuş işleve sahip olduğum ve bunları oluşturduğum bazı genel işlevlerde belirtmek istediğim bir durum var (temel kodun yeniden kullanılmasına izin vermek için). oluşturulan işlev adları. Bu üretilinceC Oluşturulan işlev adları için işlemci ön tanımlı tanımlama

void Callback_SignalName1(void); 
void Callback_SignalName2(void); 
...etc 

, onları jenerik olarak izin vermek için bir makro tanımlamak eder: aşağıdaki gibi

Aslında, fonksiyon isim listesini sahiptir. Benim fikrim bu, ama makro olarak tanımlanır ne C öncesi işlemci makro adını yerine sürer ... uygulamadan herhangi şansları olmadı:

#define SIGNAL1 SignalName1 
#define SIGNAL2 SignalName2 

#define FUNCTION_NAME(signal) (void Callback_ ## signal ## (void)) 
... 
... 
FUNCTION_NAME(SIGNAL1) 
{ 
    .. 
    return; 
} 

sorunu Ben iyi bir yol bu çevrede var mı

void Callback_SIGNAL1(void) 

yerine

void Callback_SignalName1(void) 

ait alıyor olmasıdır?

örn:

+0

olmamalı #define FUNCTION_NAME (funcname) void işlev_ismi (void)? –

+0

Üzgünüz, biraz daha açıklık için düzenlenmiş ... Orada fonksiyon isminin başka bir parçası olduğunu önemli bir parçası dışarıda bıraktım ... – espais

+0

## "signal" ve "(void)" arasında olduğunu unutmayın. Doğru değil. ## birden fazla jetonu birleştirerek tek bir jeton oluşturmak içindir. Açık parantez, işlev adı olacak belirtinin parçası olamaz (ve olmamalıdır!). –

cevap

27

Sen doğru genişlemesini sağlamak için "fonksiyonu benzeri makro" fazladan bir düzeyde sağlamak için gereken

#define SIGNAL1 SignalName1 
#define SIGNAL2 SignalName2 

#define MAKE_FN_NAME(x) void Callback_ ## x (void) 
#define FUNCTION_NAME(signal) MAKE_FN_NAME(signal) 

FUNCTION_NAME(SIGNAL1) 
{ 
    return; 
} 

çıkışı:

$ gcc -E prepro.cc 
# 1 "prepro.cc" 
# 1 "<built-in>" 
# 1 "<command-line>" 
# 1 "prepro.cc" 







void Callback_SignalName1 (void) 
{ 
return; 
} 
+0

gerçekten de; aksi halde ## operatörü argümanı sadece Callback_ ile tam olarak birleştirir. – Adriaan

+0

Teşekkürler Charles ... Bunu takdir ediyorum! – espais

İlgili konular