将char *传递给期望unsigned char的方法*

我正在研究一些有SDK的嵌入式设备。 它有一个方法,如:

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

但是我在他们的例子中看到了调用代码的例子:

MessageBox("hi","hello");

传递字符指针而不用转换。 这可以很好地定义吗? 我在问,因为我在代码上运行了一些工具,并且抱怨上面的不匹配:

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使用可疑的约定。


问题归结为正在实现中定义charunsigned还是已signed

没有错误的编译器将是char实际上unsigned那些编译器。 其中一些(特别是那些实际上是C ++编译器,其中charunsigned char是不同类型的)将发出警告。 有了这些编译器,将指针转换为unsigned char *将是安全的。

报告错误的编译器将是那些实际上被signed char 。 如果编译器(或主机)使用ASCII或类似的字符集,并且该串中的字符被打印,则转换字符串unsigned char * (或,更好, const unsigned char *这避免丢弃const从字符串文字岬)在技术上是安全的。 但是,对于使用不同字符集的实现或包含非可打印字符的字符串(例如signed char类型为负值且unsigned char值大于127的值),这些转换可能不安全。 我说可能不安全,因为发生什么取决于被调用函数的作用 - 例如它是否检查单个字符的值? 它是否检查字符串中单个字符的各个位? 后者是,如果被调用的函数设计得很好,一个理由是它会接受一个指向unsigned char *的指针。

因此,您需要做的事情归结于您对目标机器的假设,以及它的charunsigned char类型 - 以及函数对其参数所做的事情。 最通用的方法(就其适用于所有字符集而言,无论char是带signed还是unsigned ),都是创建一个帮助函数,将char数组复制到不同的unsigned char数组中。 该辅助函数的工作将取决于如何(以及如果)您需要处理signed char值与负值的转换。

链接地址: http://www.djcxy.com/p/26713.html

上一篇: Pass char* to method expecting unsigned char*

下一篇: Javascript : functions without prototype