c - 将 char* 传递给需要 unsigned char* 的方法

标签 c

我正在开发一些具有 SDK 的嵌入式设备。它有一个像这样的方法:

MessageBox(u8*, u8*); // u8 is typedefed unsigned char when I checked

但我在他们的示例中看到调用代码如下:

MessageBox("hi","hello");

不强制转换就传递 char 指针。这可以明确定义吗?我问是因为我在代码上运行了一些工具,它提示上面的不匹配:

messageBox("Status", "Error calculating \rhash");
diy.c  89  Error 64:  Type mismatch (arg. no. 1) (ptrs to signed/unsigned)
diy.c  89  Error 64:  Type mismatch (arg. no. 2) (ptrs to signed/unsigned)


有时我对这个答案有不同的看法,这让我更加困惑。所以综上所述,按照上面描述的方式使用他们的API,是这个问题吗?会导致程序崩溃吗?

而且很高兴听到正确的方法是什么,然后将字符串传递给期望 unsigned char* 且不会导致违反约束的 SDK 方法?

最佳答案

这是一个约束违规,所以在技术上它没有很好的定义,但在实践中,这不是问题。然而,你应该抛出这些论据来压制这些警告。用丑陋的强制转换乱扔代码的另一种方法是定义一个内联函数:

static inline unsigned char *ucstr(const char *str) { return (unsigned char *)str; }

并在需要将字符串传递给(错误地)采用 unsigned char * 参数的 API 时使用该函数:

messageBox(ucstr("hi"), ucstr("hello"));

这样您就不会在保持某种类型安全的同时收到警告。

另请注意,messageBox 应采用 const char * 参数。此 SDK 使用有问题的约定。

关于c - 将 char* 传递给需要 unsigned char* 的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30537170/

相关文章:

有人可以解释这个 C 输出吗?

c - 为什么我的以下 C 代码中出现段错误?

使用 execl 创建的子进程不接受任何输入

c - 通过剥离未使用的代码来解决 undefined reference

将linux的.so文件转换为windows的.dll文件

c - 将控制台隐藏在 Windows 套接字上

python - 高效地生成一个字符串所有可能子串的列表

将整数和字符串转换为十六进制字符串,并将它们以 C 中正确的字节顺序放置在其他十六进制字符串之间

c - 如何用C写这个方程式?

c++ - 使用gcc编译c/c++程序