gpt4 book ai didi

c - 为什么我需要在外部声明这个函数。没有它也能工作

转载 作者:太空狗 更新时间:2023-10-29 15:54:23 26 4
gpt4 key购买 nike

我是外部概念的新手。今天在工作中,我遇到了大量在头文件中声明的外部函数; foo.h.在乱七八糟的文件夹中的某个地方,我发现了一个 foo.c 文件,其中包含上述函数的定义,但它没有 #include foo.h。回到家后,我决定尝试一下外部存储类示例。在阅读了“C 书”之后,这就是我想出的。

这是我没想到的工作。但确实如此。

ma​​in.c

#include <stdio.h> 

int data;

int main()
{

data = 6;

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

data = 8;

printf("%d\n", getData());
return 0;
}

externs.c

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

狂欢

gcc main.c externs.c -o externs

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

ma​​in2.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;
}

externs.h

#ifndef _EXTERNSH_
#define _EXTERNSH_

extern int getData();

#endif

externs.c

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 对此进行测试。

关于c - 为什么我需要在外部声明这个函数。没有它也能工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35076280/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com