由于非常具体的原因,我有一个这样的枚举:
typedef enum RSGameType
{
RSGameTypeUnknown = 0,
RSGameType1v1 = '1v1',
RSGameType2v2 = '2v2',
RSGameType3v3 = '3v3',
RSGameType4v4 = '4v4',
RSGameTypeCustom = 'Cust'
} RSGameType;
Run Code Online (Sandbox Code Playgroud)
然而,Clang警告我除了'Cust'之外每个项目的'多字符常数'(因为我认为这是一个4个字符的常量).
是否有正确的方法来关闭这些警告,除了使用数字等效?预先设置null('\x001v1')没有效果,虽然附加一个有效(但这是不合需要的,因为值不再准确).
多字符常量不可移植; 它们的值是实现定义的.该语言甚至不保证'1v1'并'2v2'具有不同的值.这可能不是一个问题,但如果您需要RSGameType在不同编译器编译的代码之间共享值,则可能会遇到麻烦.
我猜你已经意识到了这一切.
但这是一个不受实现定义行为影响的解决方案:
#define CHAR3(c0, c1, c2) (((c0)<<16) | ((c1)<<8) | (c2))
#define CHAR4(c0, c1, c2, c3) (((c0)<<24) | ((c1)<<16) | ((c2)<<8) | (c3))
typedef enum RSGameType
{
RSGameTypeUnknown = 0,
RSGameType1v1 = CHAR3('1', 'v', '1'),
RSGameType2v2 = CHAR3('2', 'v', '2'),
RSGameType3v3 = CHAR3('3', 'v', '3'),
RSGameType4v4 = CHAR3('4', 'v', '4'),
RSGameTypeCustom = CHAR4('C', 'u', 's', 't')
} RSGameType;
Run Code Online (Sandbox Code Playgroud)