2016-10-15 86 views
6

Makroları #include yönergesinde nasıl kullanacağım konusunda kafam karıştı.#include yönergesinde makro nasıl kullanılır?

#include "../../../../GlobalDefintions.h" 
#include "../../../../lib/libc++/" ARCH_FAMILY_S "/" ARCH_S "/stkl/printkc/printkc.h" 

GlobalDefintions.h: Bunu yaptık

#ifndef _GlobalDefintions_ 
#define _GlobalDefintions_ 

/*Architecture Information Start*/ 


#define ARCH i386 
#define ARCH_FAMILY x86 


#define ARCH_S "i386" 
#define ARCH_FAMILY_S "x86" 

/*Architecture Information End*/ 

#endif /*_GlobalDefintions_*/ 

ama bu beni ne verir şudur:

kernel.c++:24:88: fatal error: ../../../../lib/libc++/: No such file or directory 

#include "../../../../lib/libc++/" ARCH_FAMILY_S "/" ARCH_S "/stkl/printkc/printkc.h" 

başarıyla ARCH_FAMILY_S eklemek için bir yolu var mı ve ARCH_S #include yönerge dizgemde?

+1

Genellikle bu şeyler derleyiciye bağlıdır ve çok kırılgandır. Bunun yerine, derleyicinin üstbilgisi yoluyla içerilecek başlıkların seçimini yol seçeneğini ve/veya ortam değişkenini kontrol edin. Örneğin. G ++ için CPATH ve Visual C++ için "INCLUDE". –

+1

Birleştirme için bir birleştirme makrosu tanımlayabilirsiniz. Ama yine de derleyiciye bağlı. Makroları kullanma yönündeki genel yaklaşımın ungood olduğunu fark edinceye kadar bununla gerçekten uğraştığımı hatırlıyorum. –

+0

Şuna bir bakın: http://stackoverflow.com/questions/9096201/concatenate-string-in-c-include-filename – n3m4nja

cevap

3

Ekleme dosyanızı oluşturmak için bir dizi makro kullanabilirsiniz. Maalesef, bunu daha temiz (kaynak olarak) düşünemiyorum. Bu, arm-eabi-none-gcc v5.4.1 için çalışır.

#define LIBC_DIR ../../../../lib/libc++/ 

#define STRINGIFY_MACRO(x) STR(x) 
#define STR(x) #x 
#define EXPAND(x) x 
#define CONCAT(n1, n2) STRINGIFY_MACRO(EXPAND(n1)EXPAND(n2)) 
#define CONCAT5(n1, n2, n3, n4, n5) STRINGIFY_MACRO(EXPAND(n1)EXPAND(n2)EXPAND(n3)EXPAND(n4)EXPAND(n5)) 

// Concatenate the five elements of your path. 
// Of course, this can be simplified if there is only a prefix and a suffix 
// that needs to be added and the ARCH_FAMILY, /, and ARCH are always present 
// in the macro-generated #include directives. 
#include CONCAT5(LIBC_DIR,ARCH_FAMILY,/,ARCH,/stkl/printkc/printkc.h) 
+1

Bunun işe yaradığından emin değilim. Aldığım mesaj ölümcül hata: ../../../../ lib/libC++/\ "x86 \"/\ "i386 \" /stkl/printkc/printkc.h: Böyle bir dosya veya dizin yok garip görünüyor biçimlendirilmiş – AndyG

+0

'kernel.C++: 32:78: önemli hata: ../../../../ lib/libC++/\" x86 \ "/ \" i386 \ "/ stkl/printkc/printkc .h: Böyle bir dosya veya dizin yok – amanuel2

+0

Üzgünüm ... '_S' son eki sürümleri yerine 'ARCH' ve 'ARCH_FAMILY' kullanmanız gerekir. Cevabımı güncelledim. – lungj