我正在编程一个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之间没有其他内容写入?
答案 0 :(得分:6)
连接相邻的字符串文字标记。
换句话说,在宏扩展发生后(第4阶段),任何彼此相邻的字符串文字(也就是相邻的)都会合并成一个大字符串。因此,3个字符串"dec. duty cycle by "
,"5"
和"%"
合并为一个大字符串"dec. duty cycle by 5%"
。
然后,在第7阶段的后面,代码实际上被编译成机器代码,因此它看到interlaceMenuFct
调用只有该参数中的一个字符串。