gpt4 book ai didi

c - .c 中的变量更改值不正确

转载 作者:太空宇宙 更新时间:2023-11-04 08:36:31 25 4
gpt4 key购买 nike

我遇到了一个非常奇怪的问题,变量在我的 C 代码中错误地更改了它们的值。我在 Qt Creator 中为此项目使用 GCC。

我有一个带有 main.c 文件的普通 C 项目,在其他文件中,还有两对 .c 和 .h(battery_general.c/.h 和 fpga_gps.c/.h)。电池和 GPS 系统都需要在计时器事件中定期调用“超时”方法(我实际上使用的是 while(1)sleep(1)为了这)。在电池和 GPS 的超时功能中,我有一个名为 timeoutCounter 的 uint16_t 计时器,当调用 timeout() 函数时它会递增到 120,当它们的值重置为 0 时。这个“timeoutCounter”整数在每个相应.c 文件 的全局范围内声明,并且它们无法访问彼此的内容。仅在 main.c 中包含两个 .h,因此我可以调用 timeout() 函数。

在 while 循环内的调用逻辑中,电池 timeout() 在 GPS 之前被调用,碰巧电池的 timeoutCounter 在调用 GPS 超时之前被置为 0( ) 功能。

发生的事情是,当对 GPS 的调用发生超时时,它的 timeoutCounter(以 121 的值开始)在第一次使用时设置为 0 -它应该是 121,因为尚未对其值进行任何修改。就好像将电池的 timeoutCounter 设置为 0 会影响 GPS 的 .c 文件中的 timeoutCounter,即使它们彼此没有连接!因为当我更改 GPS 的 .c 文件中的 timeoutCounter(例如,更改为 gpsTimeoutCounter)时,错误消失了!

可能是 GCC 错误地认为这两个变量是相同的,尽管我没有使用 extern 并且文件不相关(它们之间没有#include)只是因为它们是类型相同且名称相同?它看起来确实像是 GCC 中的错误!

无论如何,会发生什么?如果需要代码,我会发布一些,但所有相关内容都已描述。我做了很多测试(全局搜索、调试等)来验证两个 .c 文件之间是否错误地建立了某种连接,但没有找到任何东西。令我难过的是:我只是更改了其中一个变量的名称,错误就消失了,如果我将两个变量更改为不同的相同名称(例如,两者都称为 gpsTimeoutCounter),则bug又出现了!

最佳答案

是的,如果不同文件中的全局变量具有相同的名称,gcc 可以将它们视为相同的符号。这发生在链接阶段,当您有两个对象 .o 文件从不同的源 .c 文件生成,并且都声明一个“外部”(全局)定义时同名。

即使您不在 header .h 文件中使用 extern,也会发生这种情况。这只是告诉编译器和链接器,extern(意为“外部链接”)定义已在别处声明(因此无需为该定义分配更多空间,它已被声明).

关于c - .c 中的变量更改值不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26025682/

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