当前位置:  开发笔记 > 编程语言 > 正文

有没有办法做一个C++样式的编译时断言来确定机器的字节序?

如何解决《有没有办法做一个C++样式的编译时断言来确定机器的字节序?》经验,为你挑选了3个好方法。

我有一些模板化的低级序列化代码,我需要在编译时明确知道系统的字节顺序(因为模板专门基于系统的字节顺序).

现在我有一个带有一些平台定义的标题,但是我宁愿通过一些模板化测试(如static_assert或boost_if)来做关于字节序的断言.原因是我的代码需要编译并在许多专业供应商的各种机器上运行,并且可能是2008年不存在的设备,因此我无法猜测可能需要进入标题年份的内容在路上.而且由于代码库的预期寿命约为10年.所以我无法永远遵循代码.

希望这能使我的情况变得清晰.

那么有没有人知道可以确定字节序的编译时测试,而不依赖于供应商特定的定义?



1> Hasturkun..:

如果你正在使用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;
}


谢谢,这是一个很好的技巧.我想我可以通过一点点再造来应用它.还不确定,但它的领先优势.

2> Robert Gambl..:

在编译时没有可移植的方法,最好的办法是使用Boost 端序宏或模拟他们使用的方法.



3> Johannes Sch..:

嗯,这是一个有趣的问题.我敢打赌,这是不可能的.我认为你必须继续使用宏,并与去BOOST_STATIC_ASSERT(!BIG_ENDIAN);,或static_assertC++ 0x中.我认为这是因为如果你的执行环境,endian'nes是一个属性.但是,在编译时考虑static_assert.

我建议你研究一下新的GNU gold ELF链接器的代码.其作者Ian Lance Taylor使用模板在编译时选择正确的字节序,以确保在运行时获得最佳性能.他明确地实例化了所有可能的endians,因此他仍然有模板定义和声明的单独编译(不是标题中的所有模板).他的代码很棒.

推荐阅读
ERIK又
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有