错误:表达式必须具有常量值

时间:2014-08-28 06:27:25

标签: c arrays compiler-errors const

我需要一些帮助才能找到解决此错误的方法。

typedef struct {
    const char *iName;
    const char *iComment;
} T_Entry;

const T_Entry Menu_PowerSupply = { "PWRS", "Power supply"};

static const T_Entry G_Commands[] = {
    { "MEM", "Memory"},
    {Menu_PowerSupply.iName,Menu_PowerSupply.iComment},
    { "SYS", "System"}
};

我收到错误:表达式必须具有常量值 我该如何解决这个问题?

对于我来说,链接时间是已知的并且固定地址是固定值:我错了


我的目的是将以下代码放入库中

const T_Entry Menu_PowerSupply = { "PWRS", "Power supply"};

以下不起作用

static const T_Entry G_Commands[] = {
    { "MEM", "Memory"},
    Menu_PowerSupply,
    { "SYS", "System"}
};

如果有人可以帮助我理解 非常规 值......

3 个答案:

答案 0 :(得分:4)

错误是因为全局变量的初始值设定项必须是常量表达式,但即使Menu_PowerSupply定义为const,它也不是常量表达式。

这类似于:

const int n = 42;
int arr[n]; 

不能在C89中编译,因为n不是常量表达式。 (它只在C99中编译,因为C99支持VLA)

答案 1 :(得分:2)

请注意,全局和/或静态变量地址 被视为编译时常量。因此,如果你使G_Commands指针数组,那么你可以初始化数组,如下所示

typedef struct
{
    const char *iName;
    const char *iComment;
}
    T_Entry;

const T_Entry EntryMemory      = { "MEM" , "Memory"       };
const T_Entry EntryPowerSupply = { "PWRS", "Power supply" };
const T_Entry EntrySystem      = { "SYS" , "System"       };

static const T_Entry *G_Commands[] =
{
    &EntryMemory,
    &EntryPowerSupply,
    &EntrySystem,
    NULL
};

static const T_Entry *G_Menus[] =
{
    &EntryPowerSupply,
    NULL
};

int main( void )
{
    const T_Entry **entry, *command, *menu;

    printf( "Commands:\n" );
    for ( entry = G_Commands; *entry != NULL; entry++ )
    {
        command = *entry;
        printf( "   %-4s %s\n", command->iName, command->iComment );
    }

    printf( "\nMenus:\n" );
    for ( entry = G_Menus; *entry != NULL; entry++ )
    {
        menu = *entry;
        printf( "   %-4s %s\n", menu->iName, menu->iComment );
    }
}

答案 2 :(得分:0)

不幸的是,常量变量不能用于常量表达式。它们被认为是无法改变的变量,但不是可以在编译时确定的常量。

解决方法:

#define MENU_PWRSPLY_NAME    "PWRS"
#define MENU_PWRSPLY_COMMENT "Power supply"

const T_Entry Menu_PowerSupply = { MENU_PWRSPLY_NAME, MENU_PWRSPLY_COMMENT };

static const T_Entry G_Commands[] = {
    { "MEM", "Memory"},
    { MENU_PWRSPLY_NAME, MENU_PWRSPLY_COMMENT },
    { "SYS", "System"}
};