我使用#define来调用一个函数,并得到以下gcc错误: 第"101"话指令

下面是定义指令:

#define HASH(STRING_VALUE) (lookup_hash(STRING_VALUE))

功能实现:

static inline uint32_t lookup_hash(const char *str)
{
    uint32_t hash = 5381;
    int32_t c;

    while ((c = *str++))
    {
        hash = ((hash << 5) + hash) + c;
    }

    return hash;
}

函数调用示例:

static const asr_handlerTree_t asr_LT_nwk_orders[]=
{
    {HASH("link"), NULL, asr_link_funct},
    {HASH("unlink"), NULL, asr_unlink_funct},

    //  Used at runtime to determinate table limit, keep at table tail
    {(uint32_t) 0, NULL, NULL}
};

GCC编译器为什么会提出这个问题,因为指令调用只应该在前处理时被函数取代?


更新:在应答反馈后添加 struct 声明:

typedef struct _asr_handlerTree_type_
{
    const uint32_t hashedIntent_u32;
    const asr_handlerTree_t * branchs;
    const funct_t Func;
} asr_handlerTree_t;

推荐答案

带有static storage duration的变量,即在FILE作用域或使用关键字static声明的变量,只能使用constant expressions进行初始化.这意味着您不能使用其他变量的值(尽管您可以使用它们的地址)或进行函数调用.

您需要用一个伪值来初始化这个特定的字段,然后有一个在main开始时调用的函数,该函数分配需要在运行时设置的值.

static const asr_handlerTree_t asr_LT_nwk_orders[]=
{
    {0, NULL, asr_link_funct},
    {0, NULL, asr_unlink_funct},

    //  Used at runtime to determinate table limit, keep at table tail
    {(uint32_t) 0, NULL, NULL}
};

void set_hashes()
{
    asr_LT_nwk_orders[0].hash = HASH("link");
    asr_LT_nwk_orders[1].hash = HASH("unlink");
}

C++相关问答推荐

C如何显示字符串数组中的第一个字母

自定义应用程序上的日志(log)轮换问题

如何在C中从函数返回指向数组的指针?

struct 上的OpenMP缩减

Ruby C Api处理异常

C语言编译阶段与翻译阶段的关系

C++中矢量类型定义和数据保护的高效解决方案

使用AVX2的英特尔2022编译器的NaN问题&;/fp:FAST

使用sscanf获取零个或多个长度的字符串

如何在C语言中正确打印图形

为什么我会收到释放后堆使用错误?

在Linux上使用vscode和lldb调试用Makefile编译的c代码

如何将另一个数组添加到集合中,特别是字符串?

使用%f格式说明符打印整数值

我不知道为什么它不能正常工作,我用了get()和fget(),结果是一样的

使用C++中的字符串初始化 struct 时,从‘char*’初始化‘char’使指针变为整数,而不进行强制转换

CS50 pset 5的皱眉脸正确地处理了大多数基本单词,并且拼写判断不区分大小写.

当用C打印过多的';\n';时输出不正确

如何在MSVC中使用intSafe.h函数?

如何使用 VLA 语法使用 const 指针声明函数