字符串是否由以下语句定义:
#define CADENA "stringy string\n"
是否在所有使用它的.c文件中重复?如果是这种情况,则可执行代码将大大增加,这不是一件好事。请考虑以下代码:
[niko@dev1 snippets]$ cat str.c
#include <stdio.h>
#define CADENA "stringy string\n"
void printit(char *s) {
printf("%s",s);
}
void main(void) {
printit(CADENA);
printit(CADENA);
}
[niko@dev1 snippets]$ gcc -o str str.c
[niko@dev1 snippets]$ ./str
stringy string
stringy string
[niko@dev1 snippets]$
在这种情况下,编译器会创建2个常量字符串吗? 如果它只是一个,那么如何控制#define指令的内容是否被复制或者是否进行了唯一引用? GCC是否有任何开关或命令行选项?
我检查了预处理器生成的内容,实际上,字符串是重复的:
[niko@dev1 snippets]$ gcc -E str.c | tail
# 5 "str.c"
void printit(char *s) {
printf("%s",s);
}
void main(void) {
printit("stringy string\n");
printit("stringy string\n");
}
[niko@dev1 snippets]$
在一个真实的用例中:
if (some condition) {
fatal_error(__FILE__,__LINE__,"Can't write to socket");
}
我使用常量 __ FILE __ 进行调试,我是否应该将其存储在变量中以减少代码大小?