使用extern关键字调用函数

3
我希望能够从其他.c文件中调用test.c中定义的函数。
我可以使用extern来调用function1吗?此外,被function1调用的function2function3是否也必须使用externother.c
extern function1();
function1();

test.c

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

void function2()
{

}

void function3()
{

}

extern function1(); 替换为 void function1(); - Jabberwocky
不需要担心function2()function3(),如果你不想从other.c中调用它们。 - Jabberwocky
我明白了。我希望function1能够调用它们,这是可以的,对吗? - skmiley1
1
通常的做法是创建other.h文件,将void function1()放在其中。然后在test.c中使用#include other.h - pm100
extern 只在共享数据时需要,函数不需要。 - pm100
test.c 文件中:如果在使用函数之前声明了 function2() 函数(这里不是这种情况),那么你就不需要做任何事情。否则,在使用 void function1() 之前,你需要先声明 void function2();void function3(); - Jabberwocky
4个回答

5

实际上,默认情况下每个函数都是外部的 :) - 除非你声明它们不是 :). 只要在第一次调用之前有原型,就足够了。

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;
}

@Filip Kočica :( 如果你这样做,你知道你想要实现什么。评论完全脱离主题。 - 0___________

4
函数声明默认为“extern”。
引用《C11》,第§6.2.2章,(我强调

如果函数标识符的声明没有存储类别说明符,则其链接将完全确定如同它被声明为存储类别说明符extern [...]

所以,你不需要明确声明它。
你需要编译翻译单元,也就是源文件(变成目标文件),然后将它们链接在一起构建可执行文件。这样就可以了。

3

extern只是告诉我们它在别的地方被定义了。而你正在编写的文件中使用了extern。但函数默认是外部的,所以你不需要明确说明。


@PeterJ_01:我变得勇敢了,解释了更多关于对象的内容以显示差异。如果您告诉我它们不符合这个答案,我可以删除它们。 - user2736738

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关键字,因为它们总是被认为是“外部的”(正如Peter所指出的那样)。


3
函数始终是外部的,而变量则不是。 - 0___________

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接