【发布时间】:2012-01-25 16:50:40
【问题描述】:
我正在编写一些“便携式”代码(意味着它针对 Linux 上的 32 位和 64 位 MSVC2k10 和 GCC),或多或少:
typedef unsigned char uint8;
C 字符串总是 uint8;这是出于字符串处理的原因。旧代码需要将 char 编译为有符号,因此我无法将编译器开关设置为默认为无符号。但是如果我正在处理一个字符串,我就不能很好地索引一个数组:
char foo[500];
char *ptr = (foo + 4);
*ptr = some_array_that_normalizes_it[*ptr];
您不能在运行时使用负数索引数组而不会造成严重后果。保持 C 字符串无符号可以更轻松地防止错误。
我真的不想每次使用一个接受 char * 的函数时都不必继续强制转换 (char *),并且还停止复制类函数以便它们接受任何一个。这尤其令人痛苦,因为字符串常量被隐式传递为 char *
int foo = strlen("Hello"); // "Hello" is passed as a char *
我希望所有这些都能正常工作:
char foo[500] = "Hello!"; // Works
uint8 foo2[500] = "Hello!"; // Works
uint32 len = strlen(foo); // Works
uint32 len2 = strlen(foo2); // Doesn't work
uint32 len3 = strlen((char *)foo2); // Works
允许这种性质的隐式类型转换可能有一些注意事项,但是,最好使用每次都采用 char * 而不进行强制转换的函数。
所以,我认为这样的事情会起作用:
operator char* (const uint8* foo) { return (char *)foo; }
然而事实并非如此。我想不出任何办法让它工作。我也找不到任何东西可以告诉我为什么似乎没有办法做到这一点。我可以看到可能的逻辑 - 像这样的隐式转换可能是导致 FAR 太多错误的原因 - 但我找不到任何说“这在 C++ 中不起作用”或为什么,或如何使它起作用(缺少使 uin8 成为一个荒谬的类)。
【问题讨论】:
-
您不能编写不涉及至少一种用户定义类型的强制转换(或运算符)
-
您有使用
signed char的旧代码??我非常怀疑... -
为什么让 uint8 成为一个可笑的类?这并不比拥有一堆杂散的全局转换函数更可笑。
-
@Kerrek SB:Visual Studio 已经隐式地对 char 进行了签名,除非您使用编译器标志......好吧,因为旧代码开始了。
-
@KerrekSB trilithium.com/johan/2005/01/char-types 。的确,它们是不同的,但包括 Visual C++ 2010 在内的现代编译器默认它们是有符号的,原因在文章中提到。
标签: c++ overloading