我想调用test.c中定义的函数来自other.c。
extern
我可以function1
给它打电话吗?另外,我是否必须使用extern
和function2
function3
来调用function1
?
other.c
extern function1();
function1();
test.c的
void function1()
{
function2();
function3();
}
void function2()
{
}
void function3()
{
}
答案 0 :(得分:3)
extern
只是告诉我们它已在其他地方定义。您正在编写extern
的文件中使用它。但默认情况下,函数是extern。所以你不需要明确它。
答案 1 :(得分:3)
函数声明是“默认情况下”extern
。
引用C11
,章节§6.2.2,(强调我的)
如果函数的标识符声明没有存储类说明符,则其链接 确定就好像它是使用存储类说明符
extern
声明的那样。 [...]
所以,你不需要明确它。
您需要将翻译单元(即源文件)编译到目标文件中,然后将它们链接在一起以构建可执行文件。应该这样做。
答案 2 :(得分:3)
实际上每个函数默认都是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;
}
答案 3 :(得分:2)
您使用extern
将 external 的符号声明为当前translation unit(大致单个源文件及其包含的所有头文件)。
第一个源文件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所述)。