【问题标题】:C #define nested in #ifdef [duplicate]C#define嵌套在#ifdef中[重复]
【发布时间】:2014-02-14 06:25:50
【问题描述】:

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

#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
}

最后一部分有问题。在:

#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,因为它是当前定义的。

请帮我解决。

【问题讨论】:

  • 这组宏会让你的代码在未来很难调试。请考虑在不使用宏的情况下进行重构。
  • 你不能把#ifdef 放在这样的#define 中。与stackoverflow.com/a/5586469/2958164 重复
  • 预处理器宏嵌套不干净。
  • 你不能#define预处理器指令。但是,如果您这样做,它们将不会在您观察时得到预处理。
  • 很抱歉,这个程序需要从头开始重写。查看发布的代码,您似乎不太可能从中挽救任何没有错误的代码。

标签: c++ c visual-c++ c-preprocessor


【解决方案1】:

你可能想要:

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

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

【讨论】:

    【解决方案2】:

    你可以试试这个:

    #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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-31
      • 2010-12-20
      • 1970-01-01
      • 1970-01-01
      • 2011-08-15
      • 1970-01-01
      • 2021-12-30
      • 2014-03-23
      相关资源
      最近更新 更多