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)
功能是隐含的extern.你可以通过声明它们来改变它static.
你是正确的,是多余的说extern int getData();相比int getData();,但也有人认为它提高了代码的清晰度.
请注意,自C99以来,您的第一个示例是格式错误.它getData在没有宣布该功能的情况下调用.在C89中,这执行了一个隐式int getData();声明,但是因为C99被删除了.使用编译器开关-std=c99 -pedantic来测试它.
| 归档时间: |
|
| 查看次数: |
105 次 |
| 最近记录: |