使用extern关键字来调用函数

时间:2017-08-28 15:59:15

标签: c extern storage-class-specifier

我想调用test.c中定义的函数来自other.c。

extern我可以function1给它打电话吗?另外,我是否必须使用externfunction2 function3来调用function1

other.c

extern function1();
function1();

test.c的

void function1()
{
    function2();
    function3();
}

void function2()
{

}

void function3()
{

}

4 个答案:

答案 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所述)。