[elektro] Másik C kérdés
hg12345
hg12345 at freemail.hu
Mon Sep 29 10:40:44 CEST 2014
Hi,
macro (#define) átadással kapcsolatban lenne kérdésem, remélem valaki tudja a megfejtést :-)
String megadásba szeretnék összetett karaktereket definiálni, valahogy így:
#define Ex_Dp 0x80
#define Ex_No 0x10
const char str1[]={"Block ",Ex_No|Ex_Dp," Tag"};
ez így hibátlanul fordul és azt kapom amit szeretnék.
mivel ilyen string definícióból elég sok található az programban, szeretném ezt egy helyen automatikusan,
generálni.
#define DefStr(i,s1,s2)
a fenti macro mögötti rész különböző különböző fordítási időkben más - más kifejtést vesz fel.
1, generálja az index nevet egy enum részeként.
2, elhelyezi a stringeket flash memóriában
3, a string pointereket egy tömbbe szervezi.
2, részeletesebben
#define StringName(name,lang) Str_##name##lang
#define DefStringName(l,s,c) const char StringName(l,0)[]={s}; //ez akár lehet =s; is
az aktuális helyettesítése
#define DefStr(i,s1,s2) \
DefStringName(i,s1,0), \
DefStringName(i,s2,1), \
A macro alkalmazása
DefStr(1,"elsö" , "második")
DefStr(2,"2" "\x10" ,"mindegy")
DefStr( 3,('2'|0x80,"input"),"lényegtelen")
A 3. macro kifejtésénél kezdődnek a problémák: (erre fejti ki a kifejezést)
const char Str_10[]={('2'|0x80,"input")}
Ez hibátlan lenne ha kapcsos zárójelen belül nem lenne normál zárójel, de így nem tudja kifejteni.
A macro megadásban a normál zárójel szükséges, mert anélkül több lenne a macro bemeneti eleme, mint amire hivatkozom.
Kérdés hogyan lehet a kifejtésből a normál zárójelet elhagyni, vagy egy belső macro-val ezt a zárójelet eltüntetni. C99 opcióval fordítok, vagyis a __VA_ARGS__ használható a macro kifejtésben, de nekem nem volt vele sikerem.
üdv
More information about the Elektro
mailing list