【发布时间】:2014-11-19 11:09:46
【问题描述】:
我遇到了一个非常奇怪的问题,即变量在我的 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 之前调用,并且在调用 GPS 的 timeout() 函数之前,电池的 timeoutCounter 被置为 0。
发生的情况是,当调用 GPS 超时时,它的 timeoutCounter(以值 121 开始)在第一次使用时设置为 0 - 自那时以来它应该为 121 的位置尚未对其值进行修改。就好像分配给电池timeoutCounter 的0 会影响GPS .c 文件中的timeoutCounter,即使它们彼此没有连接!因为当我更改 GPS 的 .c 文件中的 timeoutCounter(例如更改为 gpsTimeoutCounter)时,错误消失了!
可能是 GCC 错误地认为这两个变量是相同的,即使我没有使用 extern 并且文件不相关(它们之间没有#include)只是因为它们是相同的类型并且有相同的名字吗?它确实看起来像 GCC 中的一个错误!
无论如何,会发生什么?如果需要代码,我会发布一些,但所有相关的内容都已描述。我做了很多测试(全局搜索、调试等)来验证两个 .c 文件之间是否错误地建立了某种连接,但没有找到任何东西。我很伤心:我只是更改了其中一个变量的名称,错误消失了,如果我将两个变量都更改为不同的相同名称(例如,两者都称为gpsTimeoutCounter),错误再次出现!
【问题讨论】:
-
您是否使用了调试器(所以使用
gcc -Wall -g编译,然后使用gdb)。您应该在gdb中使用观察点 -
@ericbn 虽然我会说我的问题不是重复的,但您提供的链接似乎确实谈到了同样的问题 - 这对我理解情况很有用。谢谢!
标签: c gcc variable-assignment