我想在C++中设置一个FourCC值,即无符号4字节整数.
我想明显的方法是#define,例如
#define FOURCC(a,b,c,d) ( (uint32) (((d)<<24) | ((c)<<16) | ((b)<<8) | (a)) )
Run Code Online (Sandbox Code Playgroud)
然后:
uint32 id( FOURCC('b','l','a','h') );
Run Code Online (Sandbox Code Playgroud)
你能想到的最优雅的方式是什么?
Jam*_*kin 16
您可以使用以下命令使其成为编译时常量:
template <int a, int b, int c, int d>
struct FourCC
{
static const unsigned int value = (((((d << 8) | c) << 8) | b) << 8) | a;
};
unsigned int id(FourCC<'a', 'b', 'c', 'd'>::value);
Run Code Online (Sandbox Code Playgroud)
通过一点额外的努力,您可以在编译时检查传入的每个数字是否在0到255之间.
uint32_t FourCC = *((uint32_t*)"blah");
Run Code Online (Sandbox Code Playgroud)
为什么不呢?
编辑:int - > uint32_t.
并且它不会向uint32_t投射char**.它将(char*)转换为(uint32_t*),然后取消引用(uint32_t*).没有涉及endian-ness,因为它将uint32_t分配给uint32_t.唯一的缺陷是对齐,我没有明确指出32位类型.
或者使用内联函数执行相同的操作
inline uint32_t FOURCC(uint8_t a, uint8_t b, uint8_t c, uint8_t d)
{
return ( (uint32) (((d)<<24) | (uint32_t(c)<<16) | (uint32_t(b)<<8) | uint32_t(a)) )
}
Run Code Online (Sandbox Code Playgroud)
并避免宏的头痛,但否则你的方法对我来说很好.
通过使用 C++11 constexpr,您可以编写如下内容:
constexpr uint32_t fourcc( char const p[5] )
{
return (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3];
}
Run Code Online (Sandbox Code Playgroud)
然后将其用作:
fourcc( "blah" );
Run Code Online (Sandbox Code Playgroud)
优点:
缺点:
我认为你的算法没有任何问题。但对于这样的事情,我只会编写一个函数而不是宏。宏有很多隐藏的功能/问题,随着时间的推移,这些功能/问题可能会困扰您。
uint FourCC(char a, char b, char c, char d) {
return ( (uint32) (((d)<<24) | ((c)<<16) | ((b)<<8) | (a)) );
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6560 次 |
| 最近记录: |