检查int是否定义为宏。 13 C

时间:2017-01-18 14:23:13

标签: c macros c-preprocessor

我试图检查一下,但我似乎无法找到答案。

我正在编写一些C代码,我想知道是否给定int i,是否在某处定义为宏。例如,运行for循环检查计数器是否为宏。我已经提出了以下内容,但是当我编译时它给了我警告,所以我假设它的代码不好

for(int i = 1; i < 25; i++){
   #define DEFINED 1
   #ifndef i
   #define DEFINED 0
   #endif
   int a = DEFINED;
   if(a){
      bla bla
   }
}

非常感谢你。

3 个答案:

答案 0 :(得分:3)

简答:您不能将i用作预处理程序表达式中的条件。你甚至无法检查它是否已被定义。

更长的答案:预处理是早期翻译阶段之一。甚至在编译代码之前就会发生这种情况。 i的值仅在运行时可用。程序编译,链接,然后执行后的含义。这两个阶段尽可能地分开。

您无法检查是否定义了i变量,因为符号i仅在编译阶段被称为变量(再次,在预处理器完成运行之后)。

预处理器确实允许您有条件地编译代码,但是您不能将这些条件基于仅在以后的翻译阶段知道的事情。

答案 1 :(得分:0)

您收到警告的原因是,如果未定义宏DEFINED,则会重新定义i。您需要完全在#if

中定义此宏
#ifndef i
#define DEFINED 0
#else
#define DEFINED 1
#endif

答案 2 :(得分:0)

预处理器没有&#34;知道&#34; C.除了#error#pragma等特殊指令外,它只是一个文本替代系统。

#if((n)def)仅适用于使用#define关键字与预处理器声明的宏;像int i这样的C变量不是宏。

为了给你一个更好的主意:

#include <stdio.h>

#define MYFORLOOP for(i = 0; i < 25; i++)

int main()
{
    int i;
    int data[25];
    MYFORLOOP
    {
        data[i] = i;
    }

    MYFORLOOP
    {
        printf("%d\n", data[i]);
    }
    return 0;
}

然后在实际编译代码之前对代码进行预处理,这样编译器实际上会看到&#34;&#34;是:

// < The contents of stdio.h, including any headers it includes itself >

int main()
{
    int i;
    int data[25];
    for(i = 0; i < 25; i++)
    {
        data[i] = i;
    }

    for(i = 0; i < 25; i++)
    {
        printf("%d\n", data[i]);
    }
    return 0;
}

#ifdef i失败的原因是因为变量i不是#define宏。