【发布时间】:2014-01-02 22:13:20
【问题描述】:
在一个文件中将变量声明为静态变量并在另一个文件中进行 extern 声明 - 我认为这会在链接时出错,因为 extern 变量不会出现在任何对象中,因为在其他文件中声明的变量是带有限定符静态。但不知何故,链接器(瑞萨)没有显示任何错误并创建了可执行文件。
如果上面的用例是正确的,如果 2 个变量在 2 个不同的文件中被声明为 static,而另一个在另一个文件中声明为 extern 会发生什么?在这种情况下,将在 2 个不同的对象中创建 2 个不同的内存,但是哪个变量将被链接到另一个变量在另一个文件中声明为 extern(因为两个变量名称相同)??
file1.c
static int test_var;
fn1()
{
test_var = 1;
}
file2.c
static int test_var;
fn2()
{
test_var = 2;
}
file3.c
extern int test_var;
fn3()
{
int x;
x = test_var;
}
【问题讨论】:
-
@H2CO3,示例代码更新...
-
声明为
extern的test_var没有定义,main也没有定义。我的链接器标记了这两个错误。请展示一个完整的示例。 -
这应该给出一个链接器错误,在我的情况下它会出现(在 OS X 上使用 clang):架构 x86_64 的未定义符号:“_test_var”,引用自:file3.o 中的 _fn3
-
该代码存在许多问题。我计算了 7 个警告以及链接器错误(_test_var 和 _main),只是默认警告(clang/OSX)