[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