【问题标题】:Can you use #defined values in if statements (In C programs)?您可以在 if 语句(在 C 程序中)中使用 #defined 值吗?
【发布时间】:2010-04-30 20:14:19
【问题描述】:

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

#define STEPS_PER_REV 12345

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

编译器抱怨 if 语句的语法错误,没有给我任何细节。

【问题讨论】:

  • 错误提示“语法错误:token -> ';' ; 第 31 列”,是的,它们在同一个文件中。奇怪的是,我可以在赋值语句 CURRENT_POSITION = STEPS_PER_REV 中使用它,但不能在 IF 语句中使用
  • #define STEPS_PER_REV 12345;吗?
  • 您是否 100% 确定您的定义不是#define STEPS_PER_REV 12345; ? (注意最后一个分号 - 这不应该在那里)
  • @Jordan 要么我们在您的评论中的分配缺少分号,要么您在问题中的#define 有一个额外的分号...我将使用 aaa 和 theatrus,并猜测是后者。
  • 这就是为什么发布给你错误的确切代码而不是一些 b.s. 是非常重要的。它的版本。

标签: c if-statement c-preprocessor


【解决方案1】:

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

CURRENT_POSITION = 12345;;

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

但是你的 if 变成了:

if(CurrentPosition >= 12345;)

这当然是无效的。

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

【讨论】:

    【解决方案2】:

    您的代码片段是正确的。 #define 从字面上看是一个字符串替换(更智能)。

    您可以使用-E选项检查预处理器在gcc中正在做什么,该选项将在预处理器运行后输出代码。

    【讨论】:

      【解决方案3】:

      您是正确的,因为 C 预处理器只会将 STEPS_PER_REV 替换为 12345。因此,根据您提供的代码,您的 if 语句看起来不错。

      为了深入了解这一点,您能否发布您的代码和错误消息的实际内容。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 您可能对类型有所了解。 CurrentPosition 是一个无符号长整数。
        • 它应该使用无符号长。我认为您必须多发布一些代码,否则要找到错误并不容易。
        【解决方案5】:

        是的,但这应该是一个常量,而不是一个宏。您可能在比较中得到了错误的类型。

        【讨论】:

          【解决方案6】:

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

           **#define MAX_VALUE 500**
          
          *if( reservations < **MAX_VALUE** )*
          {
              ......
          }
          
          will be become into
          
          *if( reservations < **500**)*
          {
                  ......
          }
          

          在预处理步骤之后。这样它们就可以在 if 语句中的布尔语句中使用。

          【讨论】:

            猜你喜欢
            • 2011-07-24
            • 1970-01-01
            • 2020-11-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-07-23
            • 2020-07-27
            • 2020-06-06
            相关资源
            最近更新 更多