extern const char* const指针或extern const char数组会导致链接错误。

3

这里有一些代码:

file1.cc

#include <stdio.h>

const char *pointerString = "pointerString";
const char arrayString[] = "arrayString";
const char* const constpointerString = "constpointerString";

extern void printString();

int main(void)
{
    printString();
    return 0;
}

file2.cc

#include <stdio.h>

extern const char *pointerString;
extern const char arrayString[];
extern const char* const constpointerString;

void printString()
{
    printf("pointerString: %s\n", pointerString);
    printf("arrayString: %s\n", arrayString);
    printf("constpointerString: %s\n", constpointerString);
}

完整命令:g++ file1.cc file2.cc -o out 错误链接:

/tmp/cczatCe9.o: In function `printString()':
file2.cc:(.text+0x1f): undefined reference to `arrayString'
file2.cc:(.text+0x30): undefined reference to `constpointerString'
collect2: ld returned 1 exit status

g++版本:4.6.3(Unbuntu / Linaro 4.6.3-1ubuntu5)

有人能帮忙吗?


const 对象具有内部链接,因此变量在外部不可见。 - undefined
不管怎样,我从https://dev59.com/oGUp5IYBdhLWcg3w5Kg6上得到了答案。 - undefined
1个回答

2

将你的外部声明放在头文件中,并在两个源文件中包含它。发生的情况是,在file1.cc中,arrayStringconstpointerString具有内部链接(因为这是const对象的默认值),因此无法从其他翻译单元中看到。

当然,你也可以定义它们:

extern char const arrayString[] = "arrayString";
extern char const* const constpointerString = "constpointerString";

一般来说,最好使用标题(header)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接