首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在C++中声明Pascal风格的字符串

在C++中声明Pascal风格的字符串
EN

Stack Overflow用户
提问于 2011-10-04 21:50:08
回答 10查看 8.7K关注 0票数 22

在C语言中,有没有一种好的方法将长度优先的Pascal风格的字符串定义为常量,这样它们就可以放在ROM中?(我使用的是一个小型嵌入式系统,使用的是非GCC ANSI C编译器)。

C字符串以0结尾,例如。{'f''o''o'0}。

Pascal字符串的长度为第一个字节,例如。{3'f''o''o'}。

我可以使用以下命令声明一个要放入ROM中的C字符串:

代码语言:javascript
复制
const char *s = "foo";

对于Pascal字符串,我可以手动指定长度:

代码语言:javascript
复制
const char s[] = {3, 'f', 'o', 'o'};

但是,这很尴尬。有没有更好的方法?也许在预处理器中?

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2011-10-06 22:21:17

我认为以下是一个很好的解决方案,但不要忘记启用压缩结构:

代码语言:javascript
复制
#include <stdio.h>

#define DEFINE_PSTRING(var,str) const struct {unsigned char len; char content[sizeof(str)];} (var) = {sizeof(str)-1, (str)}

DEFINE_PSTRING(x, "foo");
/*  Expands to following:
    const struct {unsigned char len; char content[sizeof("foo")];} x = {sizeof("foo")-1, "foo"};
*/

int main(void)
{
    printf("%d %s\n", x.len, x.content);
    return 0;
}

一个问题是,它在你的字符串后面添加了一个额外的NUL字节,但这是可取的,因为这样你也可以将它用作普通的c字符串。您还需要将其转换为您的外部库所需的任何类型。

票数 21
EN

Stack Overflow用户

发布于 2015-05-22 10:21:49

GCC和clang (可能还有其他人)接受-fpascal-strings选项,该选项允许您通过将字符串中出现的第一个内容作为\p来声明pascal样式的字符串文字,例如"\pfoo"。不完全是可移植的,但肯定比时髦的宏或它们的运行时构造更好。

有关详细信息,请参阅here

票数 19
EN

Stack Overflow用户

发布于 2011-10-04 21:57:31

您仍然可以使用const char *文字和转义序列作为其指示长度的第一个字符:

代码语言:javascript
复制
const char *pascal_string = "\x03foo";

它仍然是以null结尾的,但这可能并不重要。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7648947

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档