栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

学习open62541 --- [66] UA

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

学习open62541 --- [66] UA

UA_String是比较特殊的类型,其原型如下,是个结构体,

typedef struct {
    size_t length; 
    UA_Byte *data; 
} UA_String;

平时使用C/C++时,字符串一般使用char型数组或者std::string来表示,与UA_String稍有不同,使用时有时容易掉坑里。

本文主要讲述UA_String的相关生成方法。


相关API

生成UA_String的API有三个,如下,

  • UA_STRING
  • UA_STRING_ALLOC
  • UA_STRING_STATIC

下面分别介绍,

1. UA_STRING

其原型如下,

static UA_INLINE UA_String
UA_STRING(char *chars) {
    UA_String s; s.length = 0; s.data = NULL;
    if(!chars)
        return s;
    s.length = strlen(chars); s.data = (UA_Byte*)chars; return s;
}

字符串需要事先存在,然后把其地址传给UA_STRING(),使用方法如下,

const char *aa = "hello";
UA_String ustring1 = UA_STRING((char*)aa);

std::string tt = "world";
UA_String ustring2 = UA_STRING((char*)tt.data());

char arr[128] = "hhheee";
UA_String ustring3 = UA_STRING(arr);

需要注意的是,由于需要字符串事先存在,所以在后续使用时要保证空间是有效的,否则会出现段错误。

2. UA_STRING_ALLOC

这是个宏定义,如下,

#define UA_STRING_ALLOC(CHARS) UA_String_fromChars(CHARS)

是对UA_String_fromChars()的重定义,这个函数会对传入的字符串进行拷贝(使用动态内存),不会影响原先的字符串

UA_String ustring = UA_STRING_ALLOC("hello");

如果不想后续操作会影响原先的字符串,那么就使用这个宏来生成UA_String

3. UA_STRING_STATIC

这也是个宏定义,如下,

#define UA_STRING_STATIC(CHARS) {sizeof(CHARS)-1, (UA_Byte*)CHARS}

需要字符串事先存在,不会拷贝。这个宏只适用于如下2种形式,

char arr[128] = "hhheee";
UA_String ustring1 = UA_STRING_STATIC(arr);

UA_String ustring2 = UA_STRING_STATIC("wwweee");

不能这样写,

const char *aa = "hello";
UA_String ustring1 = UA_STRING_STATIC(aa);

为什么?因为其使用了sizeof来获取字符串的字节数,这就体现了数组名和指针的区别,如下面的例子,

char aa[128];
sizeof(aa); // 等于128

char *ptr = aa;
sizeof(aa); // 等于指针长度,为4或者8

这是个潜在的坑,一不小心就掉进去了。同样,由于需要字符串事先存在,所以在后续使用时要保证空间是有效的,否则会出现段错误。


小结

本文主要讲述了生成UA_String的三个API,及其注意事项。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1001898.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号