C 使用extern关键字调用函数
我想从other.c调用test.c中定义的函数 我可以C 使用extern关键字调用函数,c,extern,storage-class-specifier,C,Extern,Storage Class Specifier,我想从other.c调用test.c中定义的函数 我可以extern调用函数1吗?另外,我是否必须在function2和function3中使用extern,这是由function1调用的 其他.c extern function1(); function1(); void function1() { function2(); function3(); } void function2() { } void function3() { } test.c extern
extern
调用函数1
吗?另外,我是否必须在function2
和function3
中使用extern
,这是由function1
调用的
其他.c
extern function1();
function1();
void function1()
{
function2();
function3();
}
void function2()
{
}
void function3()
{
}
test.c
extern function1();
function1();
void function1()
{
function2();
function3();
}
void function2()
{
}
void function3()
{
}
extern
只是告诉我们它是在其他地方定义的。您正在编写extern
的文件中使用它。但函数默认是外部函数。因此,您不需要明确说明它。函数声明是“默认的”extern
引用第§6.2.2章第11节(重点)
如果函数的标识符声明没有存储类说明符,则其链接
完全确定,就好像它是用存储类说明符extern
[…]声明的一样
所以,你不需要明确地说出来
您需要编译翻译单元,即源文件(到目标文件中),然后将它们链接在一起以构建可执行文件。实际上,默认情况下,每个函数都是extern:)-除非您声明它们不是:)。如果在第一次调用之前就有了原型就足够了
int xxx(int, int, float, double); // prototype
int main(void)
{
int x,y;
float z;
double v;
xxx(x,y,z,v);
return 0;
}
函数可以位于另一个.c文件中。您需要将对象文件包含到链接中
int xxx(int a, int b, float c, double d)
{
int result;
/* do something */
return result;
}
您可以使用
extern
声明当前文件外部的符号(大致为一个源文件及其包含的所有头文件)
简单例子
第一个源文件test1.c
extern void function1(void); // "Import" a function from another translation unit
int main(void)
{
function1(); // Can call the declared function
}
然后,第二个源文件test2.c
:
void function2(void)
{
// Do something
}
void function1(void)
{
function2(); // No extern needed, it's declared (and defined)
// in the same translation unit
}
正如您所看到的,函数function2
不需要任何extern
声明。它只在test2.c
中使用,因此只有function1
需要了解它
然而,在
test1.c
中,main
函数需要知道function1
的相关信息,因为它被调用了,然后我们对函数原型进行正向声明。这是使用extern
关键字完成的。但是对于声明函数,实际上并不需要extern
关键字,因为它们总是被认为是“外部的”(如Peter所述)。Replaceextern function1()代码>通过无效函数1()代码>。。。不,如果您不想从other.c
调用它们,您不需要关心function2()
和function3()
。我明白了。我希望function1能够调用它们,它应该能够调用,对吗?通常要做的是创建other.h,并将void function1()
放在其中。然后#在测试中包括其他.h
。c外部
仅用于共享数据,而不用于函数函数总是外部的。变量不是。@Filip Kočica:(。如果您这样做,您就知道要存档什么。注释完全关闭topic@PeterJ_01.当前位置我勇敢地解释了更多关于对象的内容以显示差异?如果你告诉我它们不符合这个答案,我可以删除