我试图检查一下,但我似乎无法找到答案。
我正在编写一些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
}
}
非常感谢你。
答案 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
宏。