2010-11-22 16 views
2

Burada yapmaya çalıştığım şeyin aşırı basitleştirilmiş bir sürümü:#Defined bir dizeyi sistem() komutuna nasıl ekleyebilirim? (Win32)

#define LOGDIRECTORY C:\\logs\\ 
system("mkdir LOGDIRECTORY"); 

Ancak, önişlemci, tanımlanan adı değiştirmek yerine. Bunun yerine, sistem komutu aslında LOGDIRECTORY isminin olduğunu ve bu yüzden program başlatılırken hatalar attığımı düşünüyor.

Yanlış olduğunu biliyorum ve ne istediğimi belirtmek için " işaretleriyle veya başka karakterlerle yapabileceğim bir şey olmalı, ama bunu anlayamıyorum. Dizini ve dosya isimlerini kodlamak istemiyorum çünkü birisi gelecekte bunları değiştirmek isteyebilir ve bir işlevi tüm işlevden daha kolay değiştirebilirdi. Xzx20

PS, bunu düz olarak kodluyorum C.

cevap

9
#define LOGDIRECTORY C:\\logs\\ 
#define DEF2STR(x) #x 
system("mkdir " DEF2STR(LOGDIRECTORY)); 
#define LOGDIRECTORY_WITH_QUOTES "C:\\logs\\" 
system("mkdir " LOGDIRECTORY_WITH_QUOTES); 

C'de, aralarında hiç operatör bulunmayan iki dize değişmezleri yazarak basit bir dizgi birleştirmesi yapabilirsiniz. "A" "B" derleme zamanında "AB"'a dönüştürülecektir. Bunu, uzun bir dizeyi birden çok satıra ayırmak için de kullanabilirsiniz.

printf("a very long " 
"string indeed"); 

, uygun bir dizeye tanımlamak dönüştürmek bir makro içinde pound işareti ( #) kullanın veya her şeyi atlayıp kendini tanımlamak içinde tırnak dahil etmek.

+0

Teşekkür! Bence bu mükemmel bir çözüm! –

+0

Bir çekicilik gibi çalıştık, teşekkürler! –

1

GCC ile derliyorsanız, son arka plandaki ters eğik çizginin bir satır devam karakteri olarak yorumlanacağından ve bunun kendi başına bir hataya neden olmadığından, tanımlamayı tırnak işaretleri ile sarmalamaktan başka seçeneğiniz yoktur. sondaki ters eğik çizgi büyük olasılıkla bir hata oluşturur. Ancak, sadece bir ters eğik çizgiden kurtulmayı seçtiyseniz, hala iki düzeydeki düzeltme makrolarını kullanmanız gerekir, yoksa sisteminiz "mkdir LOGDIRECTORY" olur.

http://gcc.gnu.org/onlinedocs/cpp/Stringification.html Yani yukarıdaki örnek olacak Bkz:

#define LOGDIRECTORY C:\\logs 
#define DEF2STR(x) #x 
#define STR(x) DEF2STR(x) 
system("mkdir " STR(LOGDIRECTORY));