【发布时间】: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 标准,它似乎也不允许:函数指针只能转换为其他函数指针。