1

可以将 ASCII 文字(不能将其称为字符串)分配给enum值,如下所示:

#include <iostream>
// Macro to handle BIG/LITTLE ENDIAN
// Endianness is suppoesed to handled in this macro
#define TEMP(X) X

enum t
{
    XX = 'AA', // 0x4141  or  0100 0001 0100 0001
};

int main()
{
    std::cout<<XX<<std::endl;
}

0x4141在这种情况下,编译器会对其进行编译并在编译时生成一个十六进制常量。它确实会生成一个编译警告,如下所示:

main.cpp:9:14: warning: multi-character character constant [-Wmultichar]
     XX = 'AA', // 0x4141  or  0100 0001 0100 0001

我的问题是,我们可以避免这个警告吗?

或者我们可以编写更优雅的代码来实现类似的结果,可能使用模板和 constexpr?

我正在寻找一种可移植的替代方案,这样我就可以在不影响核心逻辑的情况下摆脱它作为重构的一部分。

4

2 回答 2

5

我想你想要这样的东西——它不使用多字符文字顺便说一句,而是用户定义的文字称为_i64,如下定义:

#include <iostream>

//implementation of user-defined literal _i64
namespace details
{
    constexpr int64_t i64(char const *s, int64_t v)
    {
        //in C++11, constexpr function body has to be one-line
        //though C++14 has relaxed this rule.
        return *s ? i64(s+1, v * 256 + *s) : v;
    }
}

constexpr int64_t operator "" _i64(char const *s, unsigned long)
{
    return details::i64(s, 0);
}

//your use-case.
enum colors
{
    red   = "AA"_i64,   //0x4141
    green = "BB"_i64,   //0x4242
    blue  = "CC"_i64    //0x4343
};

int main()
{
    std::cout << std::hex << red << std::endl;
    std::cout << std::hex << green << std::endl;
    std::cout << std::hex << blue << std::endl;
}

输出(演示):

 4141
 4242
 4343
于 2016-08-25T11:52:49.443 回答
-1

“旧”方式仍然有效

#define Word(a, b) ((a) + ((b) >> 8))

X= Word('A', 'A');
于 2016-08-25T11:57:43.867 回答