C中文字字符串的连接

时间:2014-08-14 14:34:24

标签: c

我正在编程一个uC。为了与uC互动,我写了一个菜单。在这个菜单中,我想在终端窗口中的PC上打印一些信息(在这种情况下是tera术语VT)。 因此我想打印这样的东西: dec. duty cycle by x%和x应替换为marco中定义的数字。为此,每个菜单项都包含一个描述字符串。该字符串通过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(...)期望指向字符串的指针。但是在函数调用I(我认为是)中创建了三个字符串:dec. ...5% 它是否有效,因为这些字符串是静态的,链接器将它们按升序排列在内存中,或者编译器是否自动连接这三个字符串,因为" -tags之间没有其他内容写入?

1 个答案:

答案 0 :(得分:6)

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

  

连接相邻的字符串文字标记。

换句话说,在宏扩展发生后(第4阶段),任何彼此相邻的字符串文字(也就是相邻的)都​​会合并成一个大字符串。因此,3个字符串"dec. duty cycle by ""5""%"合并为一个大字符串"dec. duty cycle by 5%"

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