繁体   English   中英

C中文字字符串的串联

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM