2014-02-14 39 views
-1

出于某种原因,我需要定义一些嵌套的定义。但预处理器 删除我的宏的一部分。 请看下面的代码:C#定义嵌套#ifdef

#define SINGLE_ITERATION y+=xext[++xIndex]*H[hCounter--]; 
#define LOOP_ITERATION SINGLE_ITERATION \ 
    SINGLE_ITERATION SINGLE_ITERATION \ 
    SINGLE_ITERATION SINGLE_ITERATION \ 
    SINGLE_ITERATION SINGLE_ITERATION \ 
    SINGLE_ITERATION 

#define DEBUG_CODE #ifdef MEMORIZE \ 
    myOutput[xCounter]=y;  \ 
    #endif      \ 
    #ifdef STORING   \ 
    fprintf(fid,"%f\r\n",y); \ 
    #endif 

#define OUT_LOP_ITERATION y=0;   \ 
          xIndex=xCounter-HL;\ 
          for(hCounter=HL_MINUS_1;hCounter>0;) 
          {LOOP_ITERATION} \ 
          SINGLE_ITERATION 

但在定义MEMORIZE标志时出了问题。这里是预处理器的编译器通过

for(xCounter=XL_MINUS_1;xCounter>=0;xCounter--) 
{ 
y=0; 
xIndex=xCounter-HL; 
for(hCounter=HL_MINUS_1;hCounter>0;) 
{ 
    y+=xext[++xIndex]*H[hCounter--]; 
    y+=xext[++xIndex]*H[hCounter--]; 
    y+=xext[++xIndex]*H[hCounter--]; 
    y+=xext[++xIndex]*H[hCounter--]; 
    y+=xext[++xIndex]*H[hCounter--]; 
    y+=xext[++xIndex]*H[hCounter--]; 
    y+=xext[++xIndex]*H[hCounter--]; 
    y+=xext[++xIndex]*H[hCounter--]; 
    } 
    y+=xext[++xIndex]*H[hCounter--]; 
#ifdef 
myOutput[xCounter]=y; 
#endif 
#ifdef STORING 
fprintf(fid,"%f\r\n",y); 
#endif 
} 

具有part.in中的最后一个问题创建的输出:

#ifdef 
myOutput[xCounter]=y; 
#endif 
#ifdef STORING 
fprintf(fid,"%f\r\n",y); 
#endif 
} 

必须是

#ifdef MEMORIZE 
myOutput[xCounter]=y; 
#endif 
#ifdef STORING 
fprintf(fid,"%f\r\n",y); 
#endif 
} 

和预 - 处理器省略了MEMORIZE,因为它是当前定义的。

请帮我解决它。

+2

这组宏将会使你的代码这么难在未来的调试。考虑重构而不使用宏。 – Bathsheba

+1

你不能把#ifdef放在这样的#define中。重复http://stackoverflow.com/a/5586469/2958164 –

+0

预处理器宏不能干净地嵌套。 – seand

回答

0

你可能想:

#ifdef MEMORIZE 
#define DEBUG_CODE myOutput[xCounter]=y; 
#endif 

#ifdef STORING 
#define DEBUG_CODE fprintf(fid,"%f\r\n",y); 
#endif 
-1

你可以试试这个:

#if defined(MEMORIZE) && defined(STORING) 
#define DEBUG_CODE myOutput[xCounter]=y;\ 
             fprintf(fid,"%f\r\n",y); 
#elif defined(MEMORIZE) 
#define DEBUG_CODE myOutput[xCounter]=y; 
#elif defined(STORING) 
#define DEBUG_CODE fprintf(fid,"%f\r\n",y); 
#else 
#define DEBUG_CODE 
#endif