【发布时间】:2017-08-30 13:30:58
【问题描述】:
我想要一些关于宏的想法,将预处理器定义的字符串转换为帕斯卡类型的字符串,然后能够使用宏来初始化 const char 数组等。
这样的东西会很棒:
#define P_STRING_CONV(str) ...???...
const char *string = P_STRING_CONV("some string");
struct
{
char str[30];
...
}some_struct = {.str = P_STRING_CONV("some_other_string")};
我已经尝试过这样的事情:
#define DEFINE_PASCAL_STRING(var, str, strlen) struct {uint8_t len; char content[strlen-1];} (var) = {sizeof(str)-1, (str)}
(strlen 参数可以去掉,但我需要定义大小。)
这很好用,但不能用于初始化结构中的元素。对于 const char 数组,我需要将其转换为其他变量。
有什么好主意吗?
【问题讨论】:
-
1.你为什么要这样做?我认为我并不真正了解您真正想要实现的目标是什么。
-
主要问题是您似乎认为类似 Pascal 的字符串与 C 字符串兼容(指向
char的指针,或char的数组),这并不是很自然.使用类似 Pascal 的字符串会解决什么问题?为什么要使用它们? -
至少,字符串应该保留一个 NUL 终止符,因此将它们的最大长度减少到 254 个字符。至少你可以通过传递 [address+1] 将它们用作 const 参数。
-
我需要与使用类似 Pascal 的字符串的系统进行通信,这是使用它的唯一原因。它也只是为了使代码更易于理解。现在必须有一个函数来初始化一些变量,对于 const 我需要类似
const char string[30] = "\004test"; -
Hmm.. 我想我会选择 'PasStr' 类型和 'CtoPasStr()' 和 PasToCstr() 风格的 'conversion' 函数,即使这需要 malloc/free 风格的字符串内存管理以避免 1 字节溢出等。