在C语言中,有没有一种好的方法将长度优先的Pascal风格的字符串定义为常量,这样它们就可以放在ROM中?(我使用的是一个小型嵌入式系统,使用的是非GCC ANSI C编译器)。
C字符串以0
结尾,例如。{'f'
,'o'
,'o'
,0
}。
Pascal字符串的长度为第一个字节,例如。{3
,'f'
,'o'
,'o'
}。
我可以使用以下命令声明一个要放入ROM中的C字符串:
const char *s = "foo";
对于Pascal字符串,我可以手动指定长度:
const char s[] = {3, 'f', 'o', 'o'};
但是,这很尴尬。有没有更好的方法?也许在预处理器中?
发布于 2011-10-06 22:21:17
我认为以下是一个很好的解决方案,但不要忘记启用压缩结构:
#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字符串。您还需要将其转换为您的外部库所需的任何类型。
发布于 2015-05-22 10:21:49
GCC和clang (可能还有其他人)接受-fpascal-strings
选项,该选项允许您通过将字符串中出现的第一个内容作为\p
来声明pascal样式的字符串文字,例如"\pfoo"
。不完全是可移植的,但肯定比时髦的宏或它们的运行时构造更好。
有关详细信息,请参阅here。
发布于 2011-10-04 21:57:31
您仍然可以使用const char *
文字和转义序列作为其指示长度的第一个字符:
const char *pascal_string = "\x03foo";
它仍然是以null结尾的,但这可能并不重要。
https://stackoverflow.com/questions/7648947
复制相似问题