[英]Concatenation of literal strings in C
我正在编程一个uC。 为了与uC交互,我编写了一个菜单。 在此菜单中,我想在终端窗口中的PC上打印一些信息(在本例中为VT)。 因此,我想打印如下内容: dec. duty cycle by x%
dec. duty cycle by x%
和x的dec. duty cycle by 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(...)
一个指向字符串的指针。 但是在函数调用中,我(认为我)创建了三个字符串: dec. ...
dec. ...
, 5
, %
是否有效,因为这些字符串是静态的,并且链接程序将它们按升序排列在内存中,还是编译器自动将这三个字符串连接在一起,因为在“-”标记之间没有其他内容?
C标准的第5.1.1.2节描述了编译的各个阶段(在文档中称为“翻译”)。 具体来说,第六阶段是:
相邻的字符串文字标记是串联在一起的。
换句话说,在宏扩展发生之后(即阶段4),任何紧挨着(也就是相邻)的字符串文字都被组合成一个大字符串。 因此,将三个字符串"dec. duty cycle by "
, "5"
和"%"
组合成一个大字符串"dec. duty cycle by 5%"
。
然后,在第7阶段的稍后,该代码实际上被编译为机器代码,因此它看到了interlaceMenuFct
调用,其中该参数中只有一个字符串。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.