c++ - 避免在嵌入式上使用 func(char *) api
问题描述
注意:
我对我的问题进行了大量更改以使其更具体,但我会将旧问题保留在帖子末尾,以防它对任何人有用。
新问题
我正在开发一个嵌入式应用程序,它使用以下类型来表示字符串:
- 字符串文字(默认为空终止)
- std::array<char,size> (非空终止)
- std::string_view
我想要一个以统一方式接受所有这些的函数。唯一的问题是,如果输入是字符串文字,我将不得不用它来计算大小strlen
,在其他两种情况下都不起作用,但如果我使用size
它在情况 1 上不起作用。
我应该使用这样的变体:std::variant<const char *,std::span<char>>
?强迫自己使用会不会很重std::visit
?那东西甚至会正确匹配字符串的所有不同表示吗?
老问题
免责声明当我在以下上下文中提到“字符串”时,我并不是指 std::string,而只是表示字母数字系列的一种抽象方式。
大多数情况下,当我必须在 c++ 中处理字符串时,我在某些情况下使用类似void func(const std::string &);
或不使用 const 和引用的东西。现在在嵌入式应用程序上我无权访问std::string
并且我尝试使用std::string_view
的问题是,std::string_view
当由非文字构造的有时不是以空结尾的编辑:我稍微改变了问题,因为评论暗示了一些非常有帮助的提示。因此,即使 y 在下面的示例中具有大小:
std::array<char,5> x{"aa"} ;
std::string_view y(x.data());
我不能将 y 与基于 null 终止的 printf(%s,y.data()) 之类的 ac api 一起使用
#include <array>
#include <string_view>
#include "stdio.h"
int main(){
std::array<char,5> x{"aaa"};
std::string_view y(x.data());
printf("%s",x);
}
总结一下:
我能做些什么来实现一个堆栈分配的字符串,它在其构造函数中隐含地获取一个静态大小(来自空终止字符串、字符串文字、string_views 和 std::arrays)并且它是可移动的(或廉价的可复制的)?
我的班级的基本类型是什么?与基础类型相比,速度成本是多少?
解决方案
我认为您正在研究char*
.
是的,它们都指向,char
但是关于如何确定长度的特定于类型的信息并没有被它携带。即使在 C++ 的古老祖先(不是说 C...)中,指向的指针char
也不总是相同的。已经存在指向终止和非终止字符序列的指针无法混合。
在 C++ 中存在重载函数的工具,它似乎是解决您问题的明显方法。您仍然可以根据第二个参数中的显式大小信息,只使用一个(帮助程序)函数来有效地实现这一点。
重载API上“可见”的函数,三种类型的三个版本。让它以适当的方式确定长度,然后调用单个辅助函数,提供该长度。
推荐阅读
- java - SpringBoot.run 报错,不知道为什么会报错
- azure - 了解 Azure OCR 自定义模型的工作原理
- angular - 已编译的 vue.js 或 Angular 组件如何工作?你能像普通的纯 HTML 项目一样使用它吗?
- python - 我在 python 中绘图时遇到 x 刻度标签的问题
- python - 如何使用列表从用户制作密码生成器?
- .net - 具有相同用户控件的 winform 调用了两次。错误:INSERT 语句与 FOREIGN KEY 约束冲突
- flutter - 【Flutter 二维码连续扫描】
- javascript - 切换 Rater.js 的只读特性
- raspberry-pi - MAX5825满量程8位
- django - 用于迁移的 Django db 块,无需更改架构