gpt4 book ai didi

C中文字字符串的连接

转载 作者:太空宇宙 更新时间:2023-11-04 05:38:47 32 4
gpt4 key购买 nike

我正在编写 uC。为了与 uC 交互,我编写了一个菜单。在此菜单中,我想在终端窗口中打印 PC 上的一些信息(在本例中为 tera term VT)。因此我想打印这样的东西:十二月。占空比为 x% 并且 x 应该替换为宏中定义的数字。为此,每个菜单项都包含一个描述字符串。此字符串通过 1interlaceMenuFct(...) 函数传递到菜单项,并将通过 print_text(...) 函数打印到终端。所以我写道:

头文件:

#define X 5
#define _STR(s) #s
#define _XSTR(s) _STR(s)

extern void interlaceMenuFct(menuFct_t *fct, const char *description, const char *symbol, menuItem_t *parent, menuFct_t *prev, void *action, unsigned char cnt);
extern void print_text(const char *text);

在代码文件中:

interlaceMenuFct(&decDC_mf,"dec. duty cycle by "_XSTR(X)"%","-",&io_mi,&incDC_mf,&decrementDutyCycle,0);

在这里,我使用 _XSTR(s) 函数将 X 替换为数字。

现在是我的“问题”:这有效,但我不明白为什么。函数 interlaceMenuFct(...) 需要一个指向字符串的指针。但是在函数调用中我(认为我)创建了三个字符串:dec。 ..., 5, %它之所以起作用,是因为这些字符串是静态的,链接器将它们按升序放置在内存中,还是编译器自动连接这三个字符串,因为在“-tags”之间没有写任何其他内容?

最佳答案

C 标准的§5.1.1.2 描述了编译的各个阶段(在文档中称为“翻译”)。具体来说,第六阶段是:

Adjacent string literal tokens are concatenated.

换句话说,在宏扩展发生后(即第 4 阶段),任何紧挨着彼此(也称为相邻)的字符串文字将组合成一个大字符串。因此,3 个字符串 "dec. duty cycle by ""5""%" 组合成一个大字符串 “减少 5% 的占空比”

然后,稍后在第 7 阶段,代码实际上被编译成机器代码,因此它看到 interlaceMenuFct 调用在该参数中只有一个字符串。

关于C中文字字符串的连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25310737/

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