2012-05-02 35 views
44

Çok satırlı önişlemci makro nasıl oluşturulur? Ben bir satır yapmak için biliyorum:Çok satırlı önişlemci makroları

#define sqr(X) (X*X) 

ama böyle bir şey gerekir:

#define someMacro(X) 
    class X : public otherClass 
    { 
     int foo; 
     void doFoo(); 
    }; 

Bunu nasıl işe alabilirim?

Bu yalnızca bir örnektir, gerçek makro çok uzun olabilir.

+0

ile aynı probleme sahip olacaksınız SO cevap arayarak kolayca cevap alabilirsiniz. Örneğin. http://stackoverflow.com/questions/4007865/few-questions-about-the-c-preprocessor – CppLearner

+0

farklı yöntem Buradasınız: http://www.parashift.com/c++-faq/macros-with-multi-stmts .html – Ayrat

+0

İlgili: http://stackoverflow.com/questions/98944/how-to-generate-a-newline-in-a-cpp-macro –

cevap

79

Bir satır devam karakter olarak \ kullanın.

#define swap(a, b) {    \ 
         (a) ^= (b); \ 
         (b) ^= (a); \ 
         (a) ^= (b); \ 
        } 

DÜZENLEME: @abelenky Açıklamalarda belirttiği gibi, \ karakter hattı son karakter olmalıdır. Eğer değilse (bundan sonra sadece beyaz boşluk olsa bile), her satırın ardından hata mesajlarını karıştırırsınız.

#define F(x) (x) \ 
       * \ 
      (x) 
+27

bir uyarı: * \ ** son olduğundan emin olun * satırdaki karakter. C'de, beyaz boşluk tipik olarak önemli değildir, ancak bu durumda, satırın sonundaki görünmez boşluk sizi öldürebilir. – abelenky

+0

@abelenky: İyi nokta, teşekkürler. –

+2

Sonuç olarak, sonuçta elde edilen metnin bir satırda olduğunu eklemeliyiz. C, tüm beyaz boşluğu tokenlerle aynı şekilde ele aldığından, genellikle çok fazla değil, ama yine de önemlidir. –

11

Her satırın sonunda bir ters eğik çizgi (\) işareti koyarak bir makro yayılma birden fazla satır yapabilirsiniz \: Kerrek SB ve coaddict belirttiği gibi

#define sqr(X) \ 
     ((X)*(X)) 
+5

+1: köşeli parantezleri kaçırmamak için 'x'! -) – alk

2

Bir ile kaçan tarafından satırın sonunda yeni satır kaçmak gerekir:

10

LÜTFEN DİKKAT kabul cevap işaret olmalıydı, HER ZAMAN argümanlarınızın etrafında parantezler yerleştirin. Sqr örneği, CompSci kurslarında öğretilen basit örnektir.

Burada sorun: Eğer "sqr (1 + 5)" derken bunu ne olur o şekilde tanımlarsanız? doğru etrafında parantez yerleştirirseniz Sen #define sqr(x) ((x)*(x))
almak, "1 + 5 * 1 + 5" veya 11
olsun ((1 + 5) * (1 + 5)) ya da ne 36 istedik ... güzel.

Ed S. 'swap'

+0

'sqr (++ i)'? (Biz bir 'int I' varsayıyoruz) :) –

+0

Ben alıştırma olarak yaptım ve makro içine ikame edildiği gibi görünüşte' I' (bu durumda iki kez ikame edilebilen) artırılır, o zaman çarpılır.Yani sqr (++ 5) == ((7) * (7)) ' – jiveturkey

+1

@ GézaTörök sqr (++ i)' nin '((++ i) * (++ i))' ye genişletilmesi undefined davranışı çağırır çünkü 'i 'değeri bu deyim içinde bir kereden fazla değiştirilir (işlemler arasında hiçbir sıra noktası yoktur). – moooeeeep