我有一个函数
foo
需要一个 char*
。我想用硬编码来调用该函数 {0x00, 0xff}
而不先将其分配给变量。
// out of my control, uses char* as a byte array:
void foo(const char*){}
int main(void)
{
// First assigning to unsigned char (unsigned necessary for 0xff)
// then casting to char* and calling works:
unsigned char x[2] = {0x00, 0xff};
foo((char *)x);
// foo({0x00, 0xff}); // err, cannot interpret the braces
// Hint: const char
foo((const char[]){0x00, 0x01}); // works (but not with 0xff)
return 0;
}
有什么提示吗?
foo("\x00\xff");
在本例中,字符串文字的类型为 const char[3]
,它会衰减为
const char*
- 正是 foo()
所期望的。template <typename T>
using array = T[];
void foo(char*);
int main() {
foo((char*) array<unsigned char>{0x00, 0xff});
}
请注意,C 风格转换正在执行数组到指针的转换,并且还将
unsigned char*
重新解释为
char*
。使用 reinterpret_cast
和 static_cast
也可以实现相同的效果,或者使用:// note: static_cast is necessary to avoid a narrowing conversion here,
// assuming that char is signed
foo(array<char>{0x00, static_cast<char>(0xff)});
虽然这在技术上解决了问题,但这并不是特别优雅或惯用的代码。 “现代”变体将是
std::span<char>
并传递
std::array
。由于您的能力有限,并且 foo
始终接受 char*
作为字节数组,因此下一个最佳单行代码是:foo(reinterpret_cast<char*>(std::array<unsigned char>{0x00, 0xff}.data()));
这比第一个版本更详细。然而,许多人会发现
array
模板技巧令人惊讶,并且会反对在代码审查中使用它。
顺便给一下代码
foo((const char[]){0x00, 0x01});
使用复合文字,这是一个 GNU 编译器扩展,它将 C99 功能添加到 C++ 中。 由于明显的可移植性问题,我建议不要这样做。