2011-03-28 22 views
57

ile dize arasındaki bağlantıyı bir #define 'd int ile #define' d dizisini C Önişlemci kullanarak nasıl birleştirebileceğimi anlamaya çalışıyorum. Derleyicim CentOS 5 GCC 4.1. Çözüm de MinGW için çalışmalıdır.C Önişlemcisi

Bir diziye bir sürüm numarası eklemek istiyorum, ancak çalışmaya başladığım tek yol, sürüm numarası kopyasının dizge olarak tanımlanmasını sağlamaktır. Bulabildiğim

yakın şey makro argümanları alıntı bir yöntem, ama #define s

Bu çalışmaz ise çalışmıyor. # s içermeyen

#define MAJOR_VER 2 
#define MINOR_VER 6 
#define MY_FILE "/home/user/.myapp" #MAJOR_VER #MINOR_VER 

O çalışmıyor ya değerler sayılardır ve Cgeçerli değil, hangi "/home/user/.myapp" 2 6 kadar genişleyip çünkü.

Bu işe yarar, ancak sürümün kopyalarına sahip olmaktan hoşlanmıyorum çünkü bunların sayıları da gerekiyor.

#define MAJOR_VER 2 
#define MINOR_VER 6 
#define MAJOR_VER_STR "2" 
#define MINOR_VER_STR "6" 
#define MY_FILE "/home/user/.myapp" MAJOR_VER_STRING MINOR_VER_STRING 
+3

Olası yinelenen (http://stackoverflow.com/questions/240353/convert-a-preprocessor-token-to-a-string [bir dizeye bir önişlemci jetonu dönüştürme] –

cevap

97

Klasik C önişlemci soru .... dizelere dönüştürülürler.

+2

Teşekkürler. Bu işe yarıyor ve çok temiz bir çözüm. Bu durumda – jonescb

+0

STR(), Dar bir dizeyi verecektir. Bunu geniş bir dizeye dönüştürmek için bir varyasyon var mı? – gkns

2

Sen yapabileceği BOOST_PP_STRINGIZE ile: dolaylama ekstra seviyesi önişlemci önce makro genişletmek sağlayacak

#define STR_HELPER(x) #x 
#define STR(x) STR_HELPER(x) 

#define MAJOR_VER 2 
#define MINOR_VER 6 
#define MY_FILE "/home/user/.myapp" STR(MAJOR_VER) STR(MINOR_VER) 

#define MAJOR_VER 2 
#define MINOR_VER 6 
#define MY_FILE "/home/user/.myapp" BOOST_PP_STRINGIZE(MAJOR_VER) BOOST_PP_STRINGIZE(MINOR_VER) 
+20

İnsanların herşeyi nasıl Boost attığını görmek beni şaşkına çevirir. –

+4

@Frerich: Argümanınızı aşırıya çekerken, insanlar her şeyden önce g ++ atmak yerine ham derleme kodlarında kendi derleyicilerini yazmalılar ... Tekerleği yeniden icat etmenin bir anlamı yok. İyi programcılar kod yazıyor, harikalar yeniden kullanıyor. –

+0

@jonescb: sadece [üstbilgi başlığını] açın (http://svn.boost.org/svn/boost/trunk/boost/preprocessor/stringize.hpp) ve kendiniz görün. –

8

bir çalışma yolu parametrik makro olarak my_file yazmaktır:

#define MY_FILE(x,y) "/home..." #x #y 

DÜZENLEME: "Lindydancer" tarafından da belirtildiği gibi, bu çözüm argümanları makro genişletmek etmez. Daha genel bir çözümdür: ait

#define MY_FILE_(x,y) "/home..." #x #y 
#define MY_FILE(x,y) MY_FILE_(x,y) 
+1

Dürüst düşünceme göre, bu en iyi cevaptır ve diğer önerilerden çok daha basittir. Daha iyi bir derece almadım şaşırdım! – osirisgothra

+3

Maalesef çalışmayan temiz bir çözüm. "MY_FILE" ifadesine iletilen argüman makrolar ise, "A" ve "B" deyin, bu makro "/ home ..." "A" "B" 'ye genişleyecektir. – Lindydancer

+1

Doğru, ancak iyi bilinen bir çözüm var (düzenleme konusuna bakın). –

İlgili konular