2010-04-30 6 views
1

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

#define STEPS_PER_REV 12345 

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

编译器抱怨if语句有一个语法错误,它没有提供任何细节。

+2

什么是错误? – nc3b 2010-04-30 20:16:18

+0

他们在同一个文件吗? – Anycorn 2010-04-30 20:16:57

+0

错误说“语法错误:令牌 - >';' ;第31列“,是的,他们在同一个文件。奇怪的是,我可以在赋值语句中使用它CURRENT_POSITION = STEPS_PER_REV,但只是不在IF语句中 – PICyourBrain 2010-04-30 20:18:55

回答

12

评论中的人是正确的。在#define结尾处几乎肯定有分号。这意味着,你的任务就变成了:

CURRENT_POSITION = 12345;; 

(假设你已在该行的最后一个分号...)

但你如果变为:

if(CurrentPosition >= 12345;) 

这是当然无效。

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

+0

你没事没事就是这个问题! – PICyourBrain 2010-04-30 20:30:48

2

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

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

0

你是对的,因为C预处理器只会用12345代替STEPS_PER_REV。所以你的if语句看起来很好,根据你提供的代码。

为了达到这个底部,你可以请你发布你的代码和错误信息的实际内容。

0

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

+0

你可能会遇到类型的东西。CurrentPosition是一个无符号长整数。 – PICyourBrain 2010-04-30 20:20:50

+0

它应该使用无符号长整型。我认为你必须发布更多的代码,否则找到错误并不容易。 – 2010-04-30 20:24:55

0

是的,但那应该是一个const,而不是一个宏。你可能在比较中得到错误的类型。

0

#define in c是宏,它们被c预处理器用来在找到它们时替换它们。例如在你的源代码中,预处理步骤之后的

**#define MAX_VALUE 500** 

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

will be become into 

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

。以便它们可以在if语句中用于布尔语态。