C#define嵌套在#ifdef中[重复]

Posted

技术标签:

【中文标题】C#define嵌套在#ifdef中[重复]【英文标题】:C #define nested in #ifdef [duplicate] 【发布时间】: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 中。与***.com/a/5586469/2958164 重复 预处理器宏嵌套不干净。 你不能#define预处理器指令。但是,如果您这样做,它们将不会在您观察时得到预处理。 很抱歉,这个程序需要从头开始重写。查看发布的代码,您似乎不太可能从中挽救任何没有错误的代码。 【参考方案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

【讨论】:

以上是关于C#define嵌套在#ifdef中[重复]的主要内容,如果未能解决你的问题,请参考以下文章

c++#ifndef 的作用,高分在线等,举例!

#ifdef 下的 Objective-C 代码在 Swift 中不可见 [重复]

在 Windows 和 Linux 上编译 C++:ifdef 开关 [重复]

c语言define用法

C语言中#if,#if defined ,#ifdef,extern的用法描述

关于#if defined和#ifdef