2010-06-17 23 views
5

Gerçek koduma C/C++ kodu ekleyebilmeyi çok isterim, ancak derleme zamanında, bir pythonun stdout'undan gelen kod komut dosyası, makrolarla aynı şekilde.Kodları kullanarak derleme zamanında kod oluşturma

generate_boring_functions(FooBarClass,"FooBarClass.cpp") 

mı: Örneğin

, en Sadece bir nimet olacağını şu benim C++ kod yazmak mümkün, belirli bir sınıfın kamu niteliklerini bağlıdır işlevlere sahiptir istiyorum diyelim konvansiyonel araçlar kullanılarak yapılabilir mi? Yoksa Makefiles ve geçici kaynak dosyaları ile uğraşmalı mıyım?

Teşekkürler.

+0

Makefiles'in geleneksel araçlar olduğunu sanmıştım. Aklında ne var? –

+1

Sıkıcı fonksiyonlar nelerdir? Şablon tabanlı bir çözümle çözülebilecek bir şey mi? –

+0

Hayır, şablon olarak çözülebilir değil ve Makefiles'ın geleneksel yöntemler olduğunu biliyorum, ama sadece aptalca basit "g ++ foo.cpp -o foo" yaparak çalışacak bir şey kastettim, sanırım bunu sormak için çok fazla;) – Manux

cevap

3

Büyük ihtimalle Makefile'yi biraz düzeltmeniz gerekir. Kaynak dosyalarınızın her birini generate_boring_functions (veya başka bir komut-makro) yerine doğru kodlarla değiştirerek (sadece generate_boring_functions.py doğru argümanlarla) ekleyerek bir ön işlem adımı olarak okuyan bir (Python) komut dosyası yazmak kolay olurdu. ve standart girdiye göre kaynağı derleyiciye göndererek geçici dosya ihtiyacını atlayarak.

Lanet olsun, şimdi böyle bir şey yapmak istiyorum.

Düzenleme: Böyle bir kural, bir makefile içinde sıkışmış, ek yapı adımı işlemek için kullanılabilir. Bu test edilmemiş ve sadece tamamlanmış bir çekim için eklenmiştir.

%.o : %.cpp 
    python macros.py $< | g++ -x cpp -c - -o [email protected] 
+0

Kaynak derleyiciye stdin üzerinden nasıl gönderilir (temp dosyaları kullanılmaz)? – Manux

+0

Oy, http://stackoverflow.com/questions/2083874/compile-string-of-c-code – Manux

+0

@Manux: Bu yaklaşım, bir seferde sadece bir kaynak dosyasıyla çalışacak ... –

2

Makefile (veya eşdeğeri) "geleneksel" anlamına gelir!

0

Yükseltme Ön İşlemcisi Kitaplığı'nı deneyebilirsiniz. Bu sadece normal ön işlemcinin bir uzantısıdır, ancak eğer yaratıcıysanız, hemen hemen her şeyi başarabilirsiniz.

3

Makefile sizin için yeterince geleneksel değilse, akıllıca yazılmış makrolarla karşılaşabilirsiniz.

class FooBarClass 
{ 
    DEFINE_BORING_METHODS(FooBarClass) 

    /* interesting functions begin here */ 
} 

Sıklıkla COM sınıflarının boilerplate parçalarını uygulamak için bunu yaptığımı görüyorum.

Ama ne make ne de makro bir şey istiyorsanız, o zaman ne anlama geldiğini bilmiyorum.

+0

+1 makroları. –

0

PythoidC'a bir göz attınız mı? C kodu oluşturmak için kullanılabilir.

2

Bu teknolojiyi hiç kullanmadım, ancak sanki Ned Batchelder's Cog aracı gibi bir şey arıyormuşsunuz gibi geliyor.

Python komut dosyaları, C++ derleyicisinin tüketeceği C++ kodlayıcısı için ek C++ kodu oluşturulduğu şekilde C++ kaynak dosyasına gömülür. Bu nedenle, derleme işleminiz, C++ derleyici çağrılmadan önce gerçek C++ kaynak dosyasını üretmek için ek bir adımdan oluşacaktır.

İlgili konular