C Ön İşlemcisini kullanarak int'i dizeye birleştirin


91

C'yi kullanarak bir #define'd int'i bir #define' d dizesine nasıl birleştirebileceğimi anlamaya çalışıyorum. Ön İşlemcisini . Derleyicim CentOS 5 üzerinde GCC 4.1'dir. Çözüm ayrıca MinGW için de çalışmalıdır.

Bir dizeye bir sürüm numarası eklemek istiyorum, ancak onu çalıştırabilmemin tek yolu, dizeler olarak tanımlanan sürüm numarasının bir kopyasını oluşturmaktır.

Bulabildiğim en yakın şey, makro argümanlardan alıntı yapma yöntemiydi, ancak bu, #define s

Bu çalışmıyor.

#S olmadan da çalışmaz çünkü değerler sayıdır ve genişler "/home/user/.myapp" 2 6, ki bu geçerli C değildir. .

Bu işe yarıyor, ancak sürüm tanımlarının kopyalarına sahip olmaktan hoşlanmıyorum çünkü onlara sayı olarak da ihtiyacım var.


Yanıtlar:


173

Klasik C ön işlemcisi sorusu ...

Ekstra yönlendirme seviyesi, önişlemcinin makroları dizelere dönüştürülmeden önce genişletmesine izin verecektir.


3
Bu durumda STR () bir Narrow dizesi verecektir. Bunu geniş bir dizgeye dönüştürmek için bir varyasyon var mı?
gkns

5
Bunu kaç kez
Google'da aradığımı

1
İlk "STR_HELPER" gereklidir çünkü "#" yalnızca bir makro bağımsız değişkeniyle çalışır. Bunu
anlamam biraz

1
@clarkttfu, bir çeşit - evet, #yalnızca makro argümanlarıyla çalışır. Ancak, sonucun olmasını istediğimiz STR_HELPERyerde makroyu MAJOR_VERdizeye dönüştürmekten kaçınmak için makro "MAJOR_VAR"gereklidir "2".
Lindydancer

13

Bir çalışma yolu, MY_FILE'yi parametrik makro olarak yazmaktır:

DÜZENLEME: "Lindydancer" tarafından belirtildiği gibi, bu çözüm makroları argümanlarda genişletmez. Daha genel bir çözüm şudur:


1
Dürüst görüşüme göre, bu en iyi cevap ve diğer önerilerden çok daha basit. Daha iyi bir puan almamasına şaşırdım!
osirisgothra

5
Ne yazık ki işe yaramayan temiz bir çözüm. İletilen bağımsız değişken MY_FILEmakro ise, diyelim ki Ave B, bu makro olarak genişleyecektir "/home..." "A" "B".
Lindydancer

2

Bunu BOOST_PP_STRINGIZE ile yapabilirsiniz :


29
İnsanların her şeye Boost'u nasıl attığını yüzüme güldürüyor.
Frerich Raabe

4
@Frerich: Tartışmanızı uç noktalara götürürsek, insanlar her şeye g ++ atmak yerine önce kendi derleyicilerini ham makine koduyla yazmalılar ... Tekerleği yeniden icat etmenin bir anlamı yok. İyi programcılar kod yazar, harika olanlar yeniden kullanır.
Maxim Egorushkin

@jonescb: sadece destek başlığını açın ve kendiniz görün.
Maxim Egorushkin

11
Evet, denedim. İşe yaradı, ancak bir C programında bir Boost başlığı kullanmak bana biraz tuhaf geliyor.
jonescb

1
Oh, benim hatam, Cetiketi fark etmedim .
Maxim Egorushkin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.