首页 > 解决方案 > 避免在嵌入式上使用 func(char *) api

问题描述

注意:
我对我的问题进行了大量更改以使其更具体,但我会将旧问题保留在帖子末尾,以防它对任何人有用。

新问题

我正在开发一个嵌入式应用程序,它使用以下类型来表示字符串:

  1. 字符串文字(默认为空终止)
  2. std::array<char,size> (非空终止)
  3. 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)并且它是可移动的(或廉价的可复制的)?
我的班级的基本类型是什么?与基础类型相比,速度成本是多少?

标签: c++c++17null-terminatedstring-view

解决方案


我认为您正在研究char*.

是的,它们都指向,char但是关于如何确定长度的特定于类型的信息并没有被它携带。即使在 C++ 的古老祖先(不是说 C...)中,指向的指针char也不总是相同的。已经存在指向终止和非终止字符序列的指针无法混合。

在 C++ 中存在重载函数的工具,它似乎是解决您问题的明显方法。您仍然可以根据第二个参数中的显式大小信息,只使用一个(帮助程序)函数来有效地实现这一点。
重载API上“可见”的函数,三种类型的三个版本。让它以适当的方式确定长度,然后调用单个辅助函数,提供该长度。


推荐阅读