【发布时间】:2020-12-17 10:41:54
【问题描述】:
我在历史库中定义了一个struct,唉,不幸的类型选择:unsigned char * 而不是char*。
struct MyStruct {
unsigned char * myMember;
};
这个struct 被大量的 C 应用程序使用,而且越来越多的 C++ 应用程序使用它。这些 C++ 应用程序在与 strlen 一起使用时会引发错误,例如,强制我们进行强制转换。很多演员表。
我想解决这个问题。
但有一点极其重要:必须绝对兼容,无需修改,对现有项目无影响。
我想过制作一个union。唉,我的变量不能有相同的名字。
struct MyStruct {
union {
unsigned char * myMember;
// char * myMember; Obvioulsy, rejected by the compiler.
};
恐怕没有任何明显的解决方案。我错了吗?
我无法更改结构的大小,因为它映射到大小不可更改的共享内存中。
【问题讨论】:
-
你试过 std::strlen() 吗??
-
如果
char未签名,您可能只需删除unsigned就可以逃脱 -
如果您可以更改
MyStruct,为什么不按照@largest_prime_is_463035818 的建议删除unsigned? -
当谈到兼容性时,最好知道你的结构是如何使用的。
-
基本上您要求更改代码而不是更改代码。没有解决办法。如果您决定继续进行更改会更好,那么您必须接受存在一些风险。我的首选方法是将
myMember更改为其他名称以及类型的更改。这将迫使您检查名称的每一次使用,并进行适当的更改。
标签: c++ c casting compatibility