为什么我需要声明这个函数extern.它没有它

ato*_*her 3 c scope extern storage-class-specifier

我是extern概念的新手.今天在工作中我遇到了大量在头文件中声明的外部函数; foo.h. 在一堆乱七八糟的文件夹中,我发现了一个foo.c文件,其中包含所述函数的定义但却没有#include foo.h.当我回到家时,我决定使用extern存储类示例.在"C书"中做了一些阅读之后,这就是我想出来的.

这是我不希望工作的东西.但确实如此.

main.c中

#include <stdio.h> 

int data;

int main()
{

  data = 6;

  printf("%d\n", getData());

  data = 8;

  printf("%d\n", getData());
  return 0;
} 
Run Code Online (Sandbox Code Playgroud)

externs.c

int getData()
{
  extern int data;
  return data;
}
Run Code Online (Sandbox Code Playgroud)

庆典

gcc main.c externs.c -o externs
Run Code Online (Sandbox Code Playgroud)

我不认为这会起作用,因为在main之前,函数在技术上(或至少是详细的)没有定义.这是否有效,因为默认存储类int getData()extern?如果是这样,为什么甚至打扰下面的例子(类似于我在工作中看到的)?

main2.c

#include <stdio.h> 
#include "externs.h"

int data;

int main()
{

  data = 6;

  printf("%d\n", getData());

  data = 8;

  printf("%d\n", getData());
  return 0;
} 
Run Code Online (Sandbox Code Playgroud)

externs.h

#ifndef _EXTERNSH_
#define _EXTERNSH_

extern int getData();

#endif
Run Code Online (Sandbox Code Playgroud)

externs.c

int getData()
{
  extern int data;
  return data;
}
Run Code Online (Sandbox Code Playgroud)

庆典

gcc main2.c externs.c -o externs
Run Code Online (Sandbox Code Playgroud)

M.M*_*M.M 5

功能是隐含的extern.你可以通过声明它们来改变它static.

你是正确的,是多余的说extern int getData();相比int getData();,但也有人认为它提高了代码的清晰度.

请注意,自C99以来,您的第一个示例是格式错误.它getData在没有宣布该功能的情况下调用.在C89中,这执行了一个隐式int getData();声明,但是因为C99被删除了.使用编译器开关-std=c99 -pedantic来测试它.