|
8
|
| pythonic metaphor · 技术社区 · 16 年前 |
|
|
1
13
最好的做法可能是将C库函数修复为其中断前的更改行为。但也许你不能控制那个图书馆。 要考虑的第二件事是更改所有依赖于返回空字符串的C lib函数的实例,以使用将“修复”空指针的包装函数:
所以现在
可能看起来像:
如果这是不可接受的(这可能是一个繁忙的工作,但它应该是一次性的机械更改),您可以实现一个与当前使用的C lib同名的“并行”库,这些函数只需调用原始的C lib函数并适当地修复空指针。你需要玩一些棘手的游戏,用标题、链接器和/或C++命名空间来让它工作,这有很大的可能导致混乱的道路,所以我在下一条路之前会认真思考。 但是像下面这样的事情可能会让你开始:
现在,您只需将该头添加到当前调用C lib函数的.cpp文件中(并且可能删除C lib的头),然后添加
使用这些函数到.cpp文件。 那可能不是 太 坏的。也许吧。 |
|
|
2
6
没有改变C++的每个地方
在gcc编译器中,可以使用编译器扩展名“省略操作数的条件”为C函数创建包装宏。
但在一般情况下,我建议不要这样做。 |
|
|
3
3
我想您可以添加一个包装函数来测试空值,并返回一个空的std::string。但更重要的是,为什么C函数现在返回空值?空指针表示什么?如果它指示一个严重的错误,您可能希望包装函数抛出一个异常。 或者为了安全起见,您可以检查空值,处理空值大小写,然后构造一个std::string。
|
|
|
4
2
对于便携式解决方案: (A)定义您自己的字符串类型。最大的部分是整个项目的搜索和替换——如果总是std::string,或者一次性的大麻烦,那么这很简单。(我唯一要求的是,它是std::string的liskov可替换字符串,但也从一个空字符*构造一个空字符串。
最简单的实现是从std::string公开继承。即使这是不允许的(出于可以理解的原因),在这种情况下也可以,并且有助于第三方图书馆期望
(B)将std::string定义为您自己的字符串类型。危险,不推荐。我不会这么做,除非我很清楚代码库的关系,并且为您节省了大量的工作(我还添加了一些免责声明来保护我的声誉)。
(c)我通过将冒犯性类型重新定义为某个实用程序类来解决一些这样的情况,仅仅是为了包括(因此定义的范围更为有限)。但是,我不知道该怎么做
(d)写一个导入包装。如果C库头有一个比较规则的布局,和/或你知道有人分析C++代码的一些经验,你可以生成一个“包装头”。 (e)要求库所有者至少在编译时配置“空字符串”值。(切换到0后的一个可接受请求可能会破坏兼容性,在其他情况下也是如此)如果这对您来说不太管用,您甚至可以自己提交更改! |
|
|
5
2
您可以将对c-stlye函数的所有调用包装成这样的函数…
那么无论你在哪里:
替换为:
当然,这假设在函数返回空值时构造空字符串是可以接受的行为。 |
|
|
6
1
我一般不提倡对标准容器进行子类化,但在这种情况下,它可能会起作用。
|
|
|
7
0
这样可以解决你的问题。
如果您愿意,可以将错误检查逻辑插入到它自己的函数中。那么,您必须将这个代码块放在更少的地方。 |
|
Ben · 统计向量中的单词在字符串中出现的频率 1 年前 |
|
|
bear_525 · 从列中删除中间名和首字母,并保存在单独的列中 1 年前 |
|
|
asdfadf · 为什么具有相同内存值的字符串和整数打印方式不同? 1 年前 |
|
|
user764754 · 防止多行原始字符串文字中出现新行字符 1 年前 |
|
|
Bogaso · 从列表中返回与模式匹配的元素 1 年前 |
|
|
Jasco · 如何使用VBA提取两个相似字符之间的字符串中的单词? 1 年前 |