gpt4 book ai didi

在 C 中创建字符串,其中第一个字符是字符串长度

转载 作者:太空狗 更新时间:2023-10-29 17:10:56 24 4
gpt4 key购买 nike

这个问题与Concatenate string literal with char literal有关, 但稍微复杂一些。

我想创建一个字符串文字,其中字符串的第一个字符是字符串的长度,第二个字符是一个常量。这是目前的做法:

const char myString[] = 
{
0x08,
SOME_8_BIT_CONSTANT,
'H',
'e',
'l',
'l',
'o',
0x00
};

理想情况下,我想用类似的东西替换它:

const char myString[] = BUILD_STRING(0xAA, "Hello");

我试过这样实现它:

#define STR2(S) #S
#define STR(S) STR2(S)
#define BUILD_STRING(C, S) {(sizeof(S)+2), C, S}

const char myString[] = BUILD_STRING(0xAA, "Hello");

但它扩展为:

const char myString[] = {(sizeof("Hello")+2), 0xAA, "Hello"};

并且编译器似乎不喜欢混合数字和字符串。

有什么办法吗?

最佳答案

您可以就地定义一个结构来保存前缀和其余部分,方便地对其进行初始化,然后将整个 struct 视为 char 数组(不是严格别名违规,因为标准 C 允许您将任何对象视为 char 数组)。

从技术上讲,您不能保证编译器不会在前缀和其余部分之间插入填充,但实际上您可以指望它。

#define BUILD_STRING(C, S)  \
((char const*)&(struct{ char const p[2]; char const s[sizeof(S)]; })\
{ {(sizeof(S)+2), C}, S})

const char *myString = BUILD_STRING(0xAA, "Hello");

#include <stdio.h>
int main()
{
printf("%d, %#hhX, '%s'\n", myString[0], myString[1], myString+2);
//PRINTS: 8, 0XAA, 'Hello'
}

编辑:

如果您对填充的可能性疑虑重重,这里有一种静态断言未插入任何内容的方法:

#define BUILD_STRING__(S)  \
char const p[2]; char const s[sizeof(S)]
#define BUILD_STRING(C, S) \
((char const*)&(struct{BUILD_STRING__(S); \
_Static_assert(sizeof(S)+2== \
sizeof(struct{BUILD_STRING__(S);_Static_assert(1,"");}),""); \
}){ {sizeof(S)+2, C}, S})

或者,将第一个版本与(非标准)一起使用__attribute((__packed__)) 应该做同样的事情。

关于在 C 中创建字符串,其中第一个字符是字符串长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56635455/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com