我正在编写一些"可移植"代码(意思是它针对Linux上的32位和64位MSVC2k10和GCC),我或多或少地使用它:
typedef unsigned char uint8;
Run Code Online (Sandbox Code Playgroud)
C字符串总是uint8; 这是出于字符串处理的原因.传统代码需要将char编译为signed,因此我无法将编译器开关设置为默认为unsigned.但是,如果我正在处理一个字符串,我不能很好地索引一个数组:
char foo[500];
char *ptr = (foo + 4);
*ptr = some_array_that_normalizes_it[*ptr];
Run Code Online (Sandbox Code Playgroud)
您无法在运行时索引具有负数的数组,而不会产生严重后果.保持C字符串无符号可以更容易地防止错误.
我真的希望不必每次使用带有char*的函数时继续进行转换(char*),并且还要停止复制类函数以便它们采用其中之一.这尤其令人痛苦,因为字符串常量隐式传递为char*
int foo = strlen("Hello"); // "Hello" is passed as a char *
Run Code Online (Sandbox Code Playgroud)
我想要所有这些工作:
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
Run Code Online (Sandbox Code Playgroud)
可能需要注意允许这种性质的隐式类型转换,但是,每次使用带有char*而没有强制转换的函数会很好.
所以,我认为像这样的东西会起作用:
operator char* (const uint8* foo) { return (char *)foo; }
Run Code Online (Sandbox Code Playgroud)
但事实并非如此.我无法想办法让它发挥作用.我也找不到任何东西告诉我为什么似乎没有办法做到这一点.我可以看到可能的逻辑 - 像这样的隐式转换可能是导致FAR太多错误的原因 - 但我找不到任何说"这在C++中不起作用"或者为什么,或者如何使其工作(缺少让uin8成为一个荒谬的课程.
我不太喜欢使用运算符 [ab],但这就是 c++ 的用途,对吧?
您可以执行以下操作:
const char* operator+(const uint8* foo)
{
return (const char *)foo;
}
char* operator+(uint8* foo)
{
return (char *)foo;
}
Run Code Online (Sandbox Code Playgroud)
有了这些定义,你上面的例子:
uint32 len2 = strlen(foo2);
Run Code Online (Sandbox Code Playgroud)
会变成
uint32 len2 = strlen(+foo2);
Run Code Online (Sandbox Code Playgroud)
它不是自动转换,但这样您就可以轻松而明确地执行此操作。
| 归档时间: |
|
| 查看次数: |
2456 次 |
| 最近记录: |