我正在开发一些具有 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/