你能在if语句中使用#defined值吗(在C程序中)?

时间:2010-04-30 20:14:19

标签: c if-statement c-preprocessor

我是C编程的新手。我想当你输入像#define Const 5000这样的东西时,编译器只是在编译时将每个Const的实例替换为5000。那是错的吗? 我尝试在我的代码中执行此操作,并且出现语法错误。为什么我不能这样做?

#define STEPS_PER_REV 12345

... in some function
if(CurrentPosition >= STEPS_PER_REV)
{
    // do some stuff here
}

编译器抱怨if语句带有语法错误,但没有提供详细信息。

6 个答案:

答案 0 :(得分:12)

评论中的人是对的。你的#define结尾几乎肯定有一个分号。这意味着您的作业变为:

CURRENT_POSITION = 12345;;

(假设你在行尾有一个分号......)

但你的if会变成:

if(CurrentPosition >= 12345;)

当然无效。

记住,#define不是C代码。他们不需要分号。

答案 1 :(得分:2)

您的代码片段是正确的。 #define实际上是一个字符串替换(具有更多的智能)。

您可以使用-E选项检查预处理器在gcc中执行的操作,该选项将在预处理器运行后输出代码。

答案 2 :(得分:0)

你是正确的,因为C预处理器只会用STEPS_PER_REV替换12345。因此,基于您提供的代码,您的if语句看起来很好。

要了解这一点,请您发布您的代码和错误消息的实际内容。

答案 3 :(得分:0)

当你说编译器用宏的内容替换每个实例时,你是对的。检查CurrentPosition的类型,可能是错误。

答案 4 :(得分:0)

是的,但那应该是一个const,而不是一个宏。您可能在比较中输入了错误的类型。

答案 5 :(得分:0)

c中的#define是宏,c预处理器使用它们在找到它们时替换它们。例如,在源代码中

 **#define MAX_VALUE 500**

*if( reservations < **MAX_VALUE** )*
{
    ......
}

will be become into

*if( reservations < **500**)*
{
        ......
}

预处理步骤后。这样它们就可以用在句子中的布尔状态中。