【问题标题】:Declaring extern array in another module in C [closed]在 C 中的另一个模块中声明外部数组 [关闭]
【发布时间】:2016-08-03 20:00:46
【问题描述】:

编写一个日志系统,我只想在一个模块中存储和修改一个数组(我们称之为 foo.c,带有一个适当命名的头文件 foo.h),同时能够访问它在 main 中的内容。 C。在 foo.c 我有:

unsigned char log[4096] = {0};

ma​​in.c如下:

#include "foo.h"
int main(){
    extern unsigned char log[4096];

    // code

    return 0
}

产生错误:

错误:“日志”重新声明为不同类型的符号

我这样做对吗?我尝试将外部日志声明为“log[]”和“log”,但这些也无济于事。对这个问题有一点启发会有所帮助。谢谢!

【问题讨论】:

  • 请注意,您应该在定义变量的文件和使用它的文件中使用头文件中的声明(foo.h 用于标头;foo.c 用于 where它被定义,main.c 用于它的使用位置)。这为您提供了必要的交叉检查。你不应该在普通的 C 源文件中写extern;它应该只出现在标题中。任何你觉得需要写extern 的地方都意味着你没有使用你应该使用的标题,或者标题不完整。两者都会导致长期维护问题。
  • 我不会在标题中声明变量。在每个包含头文件的 c 文件中,编译器将分配该变量。我在 oldwr 项目中遇到了一个非常讨厌的错误,因为开发人员在头文件中声明了一个全局变量,并且头文件在两个不同的 c 文件中使用。

标签: c arrays declaration extern


【解决方案1】:

问题是来自<math.h>the log function。最简单的解决方案是重命名数组。

【讨论】:

  • 这就是为什么它一直告诉我这是一个函数......非常感谢您的及时回复!天哪,这么简单的解决方案。
  • 你不是唯一一个被名字冲突咬过的人。这是了解错误消息“确实意味着他们所说的......”的一种可靠方法。
【解决方案2】:

尝试将 extern 声明移到 main 之外,因为 log 是一个全局变量。

关键字 extern 基本上告诉编译器不要吐出错误,因为该符号是在另一个模块中声明的。如果在链接时找不到符号,那么您将收到错误消息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    • 2021-08-29
    • 1970-01-01
    • 2020-04-18
    • 1970-01-01
    • 2020-11-13
    相关资源
    最近更新 更多