2016-04-21 21 views
7

Sürüm bilgisi içeren bir dize içeren bir statik const dizisi belirtmek istiyorum.C önişlemcisi: stringification çalışmıyor

Zaten sürüm numaralarını içeren iki tane makro var ve buna bağlı olarak bir başlangıç ​​const dizesi oluşturmak istiyorum.

here'da açıklanan yaklaşımı kullanmayı deniyorum, ancak kullanılabilir derleyici araçlarıyla beklenen şekilde çalışmaz.

Kodum yanındadır:

#define API_VERSION_MAJOR 4 
#define API_VERSION_MINOR 47 

#define _STR(x) #x 
#define STR(x) _STR(x) 

static const char OSAPIVersion[] = 
    STR(API_VERSION_MAJOR) "." STR(API_VERSION_MINOR) ; 

Ben dizi yazdırırken, değeri "API_VERSION_MAJOR.API_VERSION_MINOR" yerine arasında "4.47" olduğunu.

Özelleştirilmiş bir GCC 4.4.1 ARM çapraz derleyici kullanıyorum.

Bilgisayarımda Cygwin GCC 4.5.3 ile aynı şeyi yaptığımda işe yarıyor.

Yardımlarınız için şimdiden teşekkür ederiz.

GÜNCELLEME: Bu API_VERSION_MAJOR ve API_VERSION_MINOR makro bir kaynak dosyada unvisible edildi çıktı

. Ben sadece dahil özledim. Çok basit. Açık olmak için çok basit.

Bu durumda herhangi bir uyarı çıktısı olmadığını unutmayın.

+4

, sorununuza Tamamen alakasız ama sembol isimlerini bir altçizgi ile takip etmeyiniz, daha sonra "uygulama" (yani derleyici ve standart kütüphane) için ayrıldıkları için büyük harfle yazılmalıdır. –

+3

Sadece kod parçasını gcc 4.4, 4.8 ve 4.9, i386, x64 ve Ubuntu 12.04 ve 14.04'te çapraz kol ile denediniz - beklendiği gibi çalışır ('compiler -E testfile.c' kullanarak). Sanırım sorun başka bir yerde yatıyor. Aksi halde çalışmamak için bir derleyici/önişlemcide büyük bir hata olur. – Dummy00001

+0

Yayınlanan kod kaynak dosyadan kopyalandı ve yapıştırıldı mı? – LPs

cevap

7

Ardından, özelleştirilmiş GCC 4.4.1 ARM çapraz compiler'iniz buggy'dir.

Kendiniz derlediyseniz, bazen tüm kıvrımları ütülenmemiş olabilecek aşırı agresif optimizasyon seçeneklerini devre dışı bırakmaya yardımcı olur.

#define API_VERSION_MAJOR "4" 
#define API_VERSION_MINOR "47" 
static const char OSAPIVersion[] = API_VERSION_MAJOR "." API_VERSION_MINOR; 

ya da belki Çalışma zamanında dizesi oluşturmak: Kutunun dışında düşünmek

, sorunu önlemek için kaynak kodunu ayarlamak olabilir

#define API_VERSION_MAJOR 4 
#define API_VERSION_MINOR 47 
static char OSAPIVersion[8]; 
int main(void) { 
    snprintf (OSAPIVersion, sizeof OSAPIVersion, "%d.%d", API_VERSION_MAJOR, API_VERSION_MINOR); 
} 
İlgili konular