2011-09-30 128 views
0
#include <stdio.h> 
int call() 
{ 
    extern int b; 
    b=10; 
    printf("%d",b); 
} 

int main() 
{ 
    int b=8; 
    call(); 
    return 0; 
} 

为什么 抛出这样的错误,这些 做我得到下面的连接错误:为什么它返回一个错误?

/tmp/ccAsFhWX.o:meka.c:(.text+0x7): undefined reference to `_b' collect2: ld returned 1 exit status 

我想改变使用extern关键字的其他功能b值,但它给了我一个错误。我对吗?

+2

已经问过100个问题的人应该确定知道在发布之前他们会*缩进他们的代码。 –

+0

对不起!希望我不会再这样做 – niko

回答

7

声明extern int b声明为... extern。它必须在其他地方定义。如果不是,请删除extern关键字?

我认为你需要一个全局变量:

#include <stdio.h> 

static int b; 

int call() 
{ 
    b=10; 
    printf("%d",b); 
} 

int main() 
{ 
    b=8; 
    call(); 
    return 0; 
} 

如果声明全局bextern你获得的可能性(和义务)在其他地方定义它(也许在另一个翻译单位(helpers.c )或库(helpers.a)等)

+0

它不一定要在另一个翻译单元中定义。 – 2011-09-30 13:28:53

+0

@Vlad ok ....让_more_clear(它说'_perhaps_在另一个恩'已经) – sehe

+0

太好了。谢谢。 – 2011-09-30 13:42:19

0

要改变在main()的 “b”,你必须通过一个指向 “呼叫” 像call (&b)然后做

void call (int *b) { 
    *b = 10; 
    printf("%d",*b); 
} 
1

在C编程语言中,外部变量是在任何功能块外定义的变量。请阅读关于extern变量(例如,here)。

此外,变量有范围。例如,它可以是局部变量,全局变量等。您可以阅读关于here的更多信息。

因此,您在这里所做的是在函数call()中声明函数范围变量,而不使用extern关键字的强度来定义它。换句话说,只是告诉编译器该变量已经存在。最重要的是,您在函数main()中声明并定义了另一个函数作用域变量,它具有相同的名称。理解这些变量完全不同是很重要的。因此,在一天结束时,当您链接程序时,找不到函数call()的变量b的定义。你宣布但没有定义,记得吗?

以下是可能的解决方案。不要声明多个b变量,因为这显然不是您的意图。与单一的声明和定义棒:

#include <stdio.h>  

extern int b; 

void call() 
{ 
    b = 10; 
    printf("%d\n",b); 
} 

int b = 8; 

int main() { 
    call(); 
    return 0;  
} 

但全局变量通常是非常糟糕 - 全球范围内让他们非常pipeline unfriendly,引进线程问题等,所以你必须寻找到像这样:

#include <stdio.h>  

void call (int *b) 
{ 
    printf ("%d\n", *b = 10); 
} 

int main() { 
    int b = 8; 
    call (&b); 
    return 0;  
} 

我也建议你阅读the following question and answers here。它解释了很多关于在C中的extern变量。

而顺便说一下,你的函数call()被声明为int返回类型,但什么都不返回。

希望它有帮助!

相关问题