将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使用可疑的约定。
问题归结为正在实现中定义char
是unsigned
还是已signed
。
没有错误的编译器将是char
实际上unsigned
那些编译器。 其中一些(特别是那些实际上是C ++编译器,其中char
和unsigned char
是不同类型的)将发出警告。 有了这些编译器,将指针转换为unsigned char *
将是安全的。
报告错误的编译器将是那些实际上被signed
char
。 如果编译器(或主机)使用ASCII或类似的字符集,并且该串中的字符被打印,则转换字符串unsigned char *
(或,更好, const unsigned char *
这避免丢弃const
从字符串文字岬)在技术上是安全的。 但是,对于使用不同字符集的实现或包含非可打印字符的字符串(例如signed char
类型为负值且unsigned char
值大于127的值),这些转换可能不安全。 我说可能不安全,因为发生什么取决于被调用函数的作用 - 例如它是否检查单个字符的值? 它是否检查字符串中单个字符的各个位? 后者是,如果被调用的函数设计得很好,一个理由是它会接受一个指向unsigned char *
的指针。
因此,您需要做的事情归结于您对目标机器的假设,以及它的char
和unsigned char
类型 - 以及函数对其参数所做的事情。 最通用的方法(就其适用于所有字符集而言,无论char
是带signed
还是unsigned
),都是创建一个帮助函数,将char
数组复制到不同的unsigned char
数组中。 该辅助函数的工作将取决于如何(以及如果)您需要处理signed char
值与负值的转换。