2

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

extern可以function1打电话吗?另外,我是否必须使用externinfunction2function3,被调用的function1

其他.c

extern function1();
function1();

测试.c

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

void function2()
{

}

void function3()
{

}
4

4 回答 4

3

extern只是告诉我们它是在其他地方定义的。并且您正在编写的文件中使用它extern。但是函数默认是外部的。因此,您无需明确说明。

于 2017-08-28T16:03:15.800 回答
3

函数声明是“默认的” extern

引用C11,第 §6.2.2 章,(强调我的

如果函数标识符的声明没有 storage-class specifier,则其链接将完全确定,就好像它是使用 storage-class specifier 声明的一样extern[...]

因此,您无需明确说明。

您需要编译翻译单元,即源文件(到目标文件),然后将它们链接在一起以构建可执行文件。那应该这样做。

于 2017-08-28T16:03:19.513 回答
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;
}
于 2017-08-28T16:04:34.483 回答
2

您用于声明当前翻译单元外部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实际上并不需要关键字,因为它们总是被认为是“外部的”(正如彼得所指出的)。

于 2017-08-28T16:05:21.560 回答