【问题标题】:Expression must have a constant value : IAR R8C and M16表达式必须有一个常数值:IAR R8C 和 M16
【发布时间】:2018-05-17 14:25:17
【问题描述】:

我正在尝试在 IAR 中编译以下代码,但出现以下错误 “表达式必须有一个常量值”。但是相同的代码在 GCC 中编译。谁能指出这段代码有什么问题。注意:这是一个遗留代码。

下面是我的代码

/*Structure*/
typedef struct KEY_VALUE
{
    uint32_t key;
    void * value_1;
    void * value_2;
    uint16_t publish;
    uint16_t attributes;
}KEY_VALUE_STRUCT; 

/*Macro Assignment*/
#define CTESTCODE_1 ((void*)GetCount)
#define CTESTCODE_2 ((void*)0)


/*Function*/
uint32  GetCount(void)
{
    /*Get relay counts returns constant value*/
    return ((uint32)GetRelayCount());
}

/*Value*/
KEY_VALUE_STRUCT RelayCount[] = {
  {100,    CTESTCODE_2 ,  CTESTCODE_1 ,    TRUE, 0 }}

我想在数组中使用该函数的返回值。请帮我解决这个问题。 谢谢!

【问题讨论】:

  • “我正在尝试将从函数返回的常量值分配给宏” 但是您甚至没有在 ((void*)GetCount) 中调用函数 GetCount。您只需返回函数GetCount 的地址并将其类型uint32 (*)(void) 转换为void*请检查您显示的代码是否正确。 除此之外,您不能在标准 C 中使用函数调用返回值来初始化具有静态存储持续时间的变量。这完全是非法的。一些编译器可能会将其作为扩展,但我也对此表示怀疑。
  • “我正在尝试将从函数返回的常量值分配给宏”,这是错误的。我的代码就是我打算将函数的地址分配给结构中的指针。这是我试图在 IAR 中编译的遗留代码
  • 您确定系统上的数据指针和函数指针大小相同并且可以相互转换吗? C 不保证这一点,但许多编译器允许这样做,因为它们通常大小相同(例如 32 位 ARM)。
  • 我不太确定。我正在使用 IAR 编译器和 64 位 Windows 机器,我的控制器是 R8C。
  • 你应该查看 IAR 手册关于指针之间的转换。我的旧 IAR for ARM 编译器手册说 “将数据指针转换为函数指针,反之亦然是非法的”。所以这对我来说是不允许的,即使尺寸相同。我还检查了 C 标准,它似乎也不允许:函数指针只能转换为其他函数指针。

标签: macros return iar


【解决方案1】:

我认为您尝试做的事情是不可能的。甚至在预处理器编译代码之前对宏进行评估。 如果它们表示常量表达式,它们可以取变量,但不能保存变量。

可能有一种方法(我必须考虑一下)来破解基于宏的函数来做你想做的事情。但你最终会得到非常危险且难以维护的代码。

【讨论】:

  • 感谢您的回复!但我观察到的是这段代码在 Ubuntu 中编译。我正在使用 GCC。但它不在 IAR 中。我正在使用瑞萨电子 R8C2A。
  • 没问题,我想我误解了你在原帖中试图做的事情。也许是工具链特定的问题?我从来没有为 R8C2A 编译过任何东西,也没有使用过 IAR 工作台。他们的工具链是基于 gcc 的吗?
  • 我认为它是特定于工具链的。 IAR 使用的是产品包自带的工具链,支持特定的微控制器。
猜你喜欢
  • 2020-04-19
  • 2022-08-23
  • 1970-01-01
  • 2021-01-14
  • 2014-10-21
  • 1970-01-01
  • 1970-01-01
  • 2021-12-02
  • 2012-07-27
相关资源
最近更新 更多