gpt4 book ai didi

c - 使用 ntohl() 初始化常量变量

转载 作者:太空狗 更新时间:2023-10-29 15:29:19 27 4
gpt4 key购买 nike

我正在尝试使用适当字节交换的值来初始化一个全局范围的 const 变量。

#include <stdio.h>
#include <stdint.h>
#include <arpa/inet.h>

const uint32_t a = ntohl(0x11223344);

int main(int argc, char const *argv[])
{
printf("%08x\n", a);
return 0;
}

使用 gcc 失败并显示“错误:初始化元素不是常量”。是的,好的,所以 gcc header 将 ntohl() 定义为函数或“do {...} while (0)”或类似的东西,这些东西在编译时无法评估。真可惜。

我能做些什么来达到同样的目的吗?我需要为适当的结束性初始化值,我希望它是一个全局范围的常量。除了滚动我自己的类似 ntohl 的宏之外,有什么方法可以说服 gcc 这样做吗?

(顺便说一句,我注意到 clang 定义了 ntohl() 以便可以在编译时对其进行评估。上面的代码示例与 clang 完美配合。不幸的是我没有选择编译器。)

最佳答案

标准阅读的第 6.7.8/4 节

All the expressions in an initializer for an object that has static storage duration shall be constant expressions or string literals.

ntohl 的调用既不是常量表达式也不是字符串文字。你无法从这里到达那里。

但是全局变量无论如何都是不好的,我怀疑这可能是一个过早的优化。简单的解决方法是直接在您的代码中使用该表达式,这在大端平台上根本没有影响,例如

void foo(void)
{
const unit32_t a = ntohl(0x11223344);
/* ... */
}

更好的是,使用预处理器宏,如

#define POTRZEBIE ntohl(0x11223344)

void bar(void)
{
const unit32_t a = POTRZEBIE;
/* ... */
}

在自动存储的变量上,const限定符表示单次赋值,所以上面的用法没有问题。

关于c - 使用 ntohl() 初始化常量变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21767766/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com