【问题标题】:Missing binary operator before token "(" in CC中标记“(”之前缺少二元运算符
【发布时间】:2020-07-28 02:40:32
【问题描述】:

我在 Ubuntu 18.04.3 LTS 中使用 gcc 版本编译器。使用 ROS 库。 我的代码很简单:

typedef unsigned char       boolean; 

#define TRUE    (boolean)(1)
#define FALSE   (boolean)(0)

以上编译后,我得到编译器错误:

error: missing binary operator before token "("
  #define TRUE    (boolean)(1)
                          ^

上面#define的用法我猜是在OS库文件中。

../../../M3N_BSW/bsw_pc/virtual/ros/librosc/XmlRpc/include/ros_lm_xml_value.h:80:6: note: in expansion of macro ‘TRUE’
---------------------------------------------------------------------
 #if (TRUE == ROS_LM_XML_VALUE_DOUBLE_ENABLE) /* [05] */
      ^~~~

但是当我定义如下时,没有错误。

#define SOMETHING  ( ( uchar8 ) 1 )

类似地,关键字boolean 在其他地方用于声明变量,这些都可以正常工作。参考下面的代码.. 和 使用地点是这样的:

#define ROS_LM_XML_VALUE_DOUBLE_ENABLE (FALSE)
someFunc()
{
     boolean someVar=FALSE;  //How come this is recognized correctly ? 
     #if (TRUE == ROS_LM_XML_VALUE_DOUBLE_ENABLE)
     {
        //Do something
     }
}

关键字boolean#define 的使用在某处出错。 请指导我。

INTEGRITY OS 中使用了相同的代码。 没有编译器错误。

【问题讨论】:

  • 这个错误可能来自一些试图使用TRUE的代码,而不仅仅是#define。你能确定并显示这样一条线吗?
  • @aschepler 感谢您的提问。我在问题中添加了用法。请务必参考并提供您宝贵的反馈意见。
  • boolean 不是关键字。你知道它实际上是如何定义的吗?
  • typedef unsigned char boolean;
  • 我猜第二组括号被解释为函数调用,

标签: ubuntu gcc boolean c-preprocessor


【解决方案1】:

似乎我们不能这样比较,因为 LHS 中的 TRUE 是类型转换的。这部分有问题。

#if (TRUE == ROS_LM_XML_VALUE_DOUBLE_ENABLE)

感谢您的支持。

【讨论】:

    【解决方案2】:

    看起来您遇到了某种极端情况。我的建议是让事情尽可能简单。

    这是另一篇讨论宏的文章。 Using boolean values in C

    宏调试的另一个策略是手动将定义替换到代码中,看看是否有更有用的东西冒出来。一个问题掩盖另一个问题是很常见的。这种缺陷的开始可能很难追踪。

    #define SOMETHING ( ( uchar8 ) 1 ) 示例似乎将值 1 转换为 uchar8。

    #define TRUE (boolean)(1) 似乎正在使用值 1 初始化布尔数据类型。

    【讨论】:

    • 在主要问题中添加了使用部分代码供您参考。请检查并提供您宝贵的反馈意见。
    【解决方案3】:

    我的答案来自另一个(更一般的)所以答案:https://stackoverflow.com/a/21338386/9006042

    当预处理器在尝试计算#if#elif 指令中的表达式时遇到无效语法时,会发生missing binary operator before token "(" 错误。因此,您在提交的答案中是正确的,错误来自 #if (TRUE == ROS_LM_XML_VALUE_DOUBLE_ENABLE) 行。

    然而,潜在的问题是您正在尝试对您正在评估的宏进行类型转换,这在 #if 指令中是不允许的。查看所有有效的#if 语法规则here

    我建议简单地将TRUE 定义为(1)(并将FALSE 定义为(0)),而不是将其类型转换为无符号字符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-13
      • 1970-01-01
      • 1970-01-01
      • 2019-08-29
      • 1970-01-01
      • 2017-06-27
      • 1970-01-01
      • 2021-12-24
      相关资源
      最近更新 更多