C语言 IAR EW中出现“表面调用parantheses之前的表达式必须具有(指向)函数类型”错误[已关闭]

n8ghc7c1  于 2022-12-26  发布在  其他
关注(0)|答案(1)|浏览(450)

**已关闭。**此问题需要debugging details。当前不接受答案。

编辑问题以包含desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将有助于其他人回答问题。
2天前关闭。
Improve this question
我正在IAR Embedded Workbench中开发一个项目,但不断收到来自函数类宏的错误。错误和导致错误的代码片段如下。构建日志:

Error[Pe109]: expression preceding parentheses of apparent call must have (pointer-to-) function type   
 
    Error[Pe018]: expected a ")"

代码:来自main. c文件

__UPDATE_SAFETY_VAR(dw_STL_dev_var, 0uL);

宏的定义:从另一个头文件。

#define __UPDATE_SAFETY_VAR(x, value)  x = value; \
x##_inv = (__typeof__(x))(~value)

我在“选项-〉C/C++编译器”中添加了头文件作为预处理器。我在mainidocc中包含了头文件。我尝试调整parantheses,但没有任何效果。
我在网上找了这个错误,但是找不到有用的解决方案。我很感激每一个建议。

6l7fqoea

6l7fqoea1#

正如Clifford在注解中指出的,问题很可能是您使用了非标准的__typeof__,而编译器不支持它。
然而,看看代码,可能并不真实的需要typeof。假设xx_inv具有相同的类型,那么无论如何,强制转换都是空操作。必须转换值以执行赋值。
这几行代码还有其他错误:
首先,包含赋值的宏必须始终包含在do{}while(0)中:

#define __UPDATE_SAFETY_VAR(x, value)  do{ \
  x = value; \
  x##_inv = (__typeof__(x))(~value); \
}while(0)

删除(可能是多余的)强制转换后得到:

#define __UPDATE_SAFETY_VAR(x, value)  do{ \
  x = value; \
  x##_inv = ~value; \
}while(0)

最后,为什么需要保留xx_inv的单独副本?为什么不保留单个副本,然后在实际需要时取其逆副本?

相关问题