foo(char*):使用硬编码字节数组调用

问题描述 投票:0回答:2

我有一个函数

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; }
有什么提示吗?

c++ arrays char
2个回答
2
投票
我可能只使用字符串文字,既漂亮又简单:

foo("\x00\xff");
在本例中,字符串文字的类型为 

const char[3]

,它会 
衰减为 const char* - 正是
foo()
所期望的。
    


2
投票

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++ 中。
由于明显的可移植性问题,我建议不要这样做。

© www.soinside.com 2019 - 2024. All rights reserved.