在多个地方使用时,是否会复制define指令中的字符串?

时间:2016-09-05 19:52:42

标签: c gcc

字符串是否由以下语句定义:

#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 __ 进行调试,我是否应该将其存储在变量中以减少代码大小?

0 个答案:

没有答案