C语言 为什么我需要声明这个函数 extern.没有它就可以工作



我对extern的概念很陌生。今天在工作中,我遇到了大量在头文件中声明的 extern 函数;在一堆文件夹中的某个地方,我发现了一个包含所述函数定义的foo.c文件,但它没有#include foo.h。当我回到家时,我决定尝试一下外部存储类示例。在"C书"中做了一些阅读后,这就是我想出的。

这是我没想到会起作用的。但它确实做到了。

主.c

#include <stdio.h> 
int data;
int main()
{
  data = 6;
  printf("%dn", getData());
  data = 8;
  printf("%dn", getData());
  return 0;
} 

外部实习生

int getData()
{
  extern int data;
  return data;
}

砰砰��

gcc main.c externs.c -o externs

我认为这行不通,因为该函数在 main 之前没有在技术上(或至少是冗长(定义。这是否有效,因为int getData()的默认存储类是 extern ?如果是这样,为什么还要打扰以下示例(类似于我在工作中看到的(?

主2.c

#include <stdio.h> 
#include "externs.h"
int data;
int main()
{
  data = 6;
  printf("%dn", getData());
  data = 8;
  printf("%dn", getData());
  return 0;
} 

外部实习生

#ifndef _EXTERNSH_
#define _EXTERNSH_
extern int getData();
#endif

外部实习生

int getData()
{
  extern int data;
  return data;
}

砰砰��

gcc main2.c externs.c -o externs

函数隐式extern。 您可以通过将它们声明为 static 来更改此设置。

你是对的,与int getData();相比,说extern int getData();是多余的,但有些人认为它提高了代码清晰度。

请注意,从 C99 开始,您的第一个示例格式不正确。 它在未声明该函数的情况下调用getData。 在 C89 中,这执行了隐式int getData();声明,但自 C99 以来,该声明被删除了。 使用编译器开关-std=c99 -pedantic对此进行测试。

默认情况下,GCC 版本 4.x 或更早版本在 C89/C90 兼容模式下编译,该模式不需要在使用前声明函数。 未声明的函数被推断为具有 int 的返回类型。 默认情况下,GCC 5.x 或更高版本在 C11 兼容模式下编译,这确实要求在使用前声明函数 — C99 也是如此。

鉴于编译的代码没有投诉,我们可以推断您使用的是GCC 4.x。

即便如此,您也没有义务提供完整的原型,尽管您不这样做是愚蠢的。 我经常使用以下选项编译代码:

gcc -std=c11 -O3 -g -Wall -Wextra -Werror -Wmissing-prototypes -Wstrict-prototypes 
    -Wold-style-definition -Wold-style-declaration …

怀疑那里有一些冗余,但是在我开始运行代码之前,这些选项会发现许多问题。

相关内容

  • 没有找到相关文章

最新更新