C 使用extern关键字调用函数

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

我想从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 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所述)。

Replace
extern function1()通过
无效函数1()。。。不,如果您不想从
other.c
调用它们,您不需要关心
function2()
function3()
。我明白了。我希望function1能够调用它们,它应该能够调用,对吗?通常要做的是创建other.h,并将
void function1()
放在其中。然后
#在测试中包括其他.h
。c
外部
仅用于共享数据,而不用于函数函数总是外部的。变量不是。@Filip Kočica:(。如果您这样做,您就知道要存档什么。注释完全关闭topic@PeterJ_01.当前位置我勇敢地解释了更多关于对象的内容以显示差异?如果你告诉我它们不符合这个答案,我可以删除