我有一些模板化的低级序列化代码,我需要在编译时明确知道系统的字节顺序(因为模板专门基于系统的字节顺序).
现在我有一个带有一些平台定义的标题,但是我宁愿通过一些模板化测试(如static_assert或boost_if)来做关于字节序的断言.原因是我的代码需要编译并在许多专业供应商的各种机器上运行,并且可能是2008年不存在的设备,因此我无法猜测可能需要进入标题年份的内容在路上.而且由于代码库的预期寿命约为10年.所以我无法永远遵循代码.
希望这能使我的情况变得清晰.
那么有没有人知道可以确定字节序的编译时测试,而不依赖于供应商特定的定义?
如果你正在使用autoconf,你可以使用AC_C_BIGENDIAN
宏,这是相当有效的(WORDS_BIGENDIAN
默认设置定义)
或者,您可以尝试类似以下内容(取自autoconf)以获得可能会被优化的测试(GCC,至少,移除其他分支)
int is_big_endian() { union { long int l; char c[sizeof (long int)]; } u; u.l = 1; if (u.c[sizeof(long int)-1] == 1) { return 1; } else return 0; }
在编译时没有可移植的方法,最好的办法是使用Boost 端序宏或模拟他们使用的方法.
嗯,这是一个有趣的问题.我敢打赌,这是不可能的.我认为你必须继续使用宏,并与去BOOST_STATIC_ASSERT(!BIG_ENDIAN);
,或static_assert
C++ 0x中.我认为这是因为如果你的执行环境,endian'nes是一个属性.但是,在编译时考虑static_assert.
我建议你研究一下新的GNU gold ELF链接器的代码.其作者Ian Lance Taylor使用模板在编译时选择正确的字节序,以确保在运行时获得最佳性能.他明确地实例化了所有可能的endians,因此他仍然有模板定义和声明的单独编译(不是标题中的所有模板).他的代码很棒.