【发布时间】:2014-02-13 23:22:48
【问题描述】:
我正在尝试使用经过适当字节交换的值来初始化全局范围的 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 头文件将 ntohl() 定义为一个函数或“do {...} while (0)”或类似的东西,在编译时无法评估。无赖。
我能做些什么来达到同样的目的吗?我需要为适当的结束性初始化值,并且我希望它是一个全局范围的常量。除了滚动我自己的类似 ntohl 的宏之外,有什么方法可以说服 gcc 这样做吗?
(顺便说一句,我注意到 clang 定义了 ntohl() 以便可以在编译时对其进行评估。上面的代码示例与 clang 完美配合。不幸的是,我没有选择编译器。)
【问题讨论】: