我在头文件中定义了以下方法
unsigned char test(void);
实现:
unsigned char test()
{
unsigned char value = 0xFF;
return value;
}
当我用它来称呼它时:
unsigned char temp;
temp = test();
什么都没有?我用断点来介绍它。在最后,变量值的值为0xFF,但它永远不会返回到temp?
我不熟悉旧的C ...只有C ++,在声明方法方面可能会有某种细微的差别。
任何帮助都将非常感谢!!!
答案 0 :(得分:6)
我认为你只看到一个聪明的编译器。如果在赋值后从未使用过您的变量,那么它就会被优化掉。尽管如此,仍然会调用该函数的可能副作用。
如果将变量更改为全局变量,则编译器无法知道您不会使用它,因此它会进行赋值。
我认为,如果您在作业后添加printf
或声明tmp
变量volatile
,您也会在调试器中观察到该作业。
答案 1 :(得分:2)
确定调试器没有用户错误? 大多数调试器在实际执行赋值之前,不会显示变量“temp”的值,直到下一行代码。
答案 2 :(得分:2)
如果启用了优化,temp可能会保留在寄存器中,有时调试器将无法找到并显示这些值。实际上,如果您不在任何地方使用它,编译器可以很好地丢弃返回值。确保编译代码时没有进行任何优化以进行调试。
或者,使用男性已知的最旧方法进行调试:printf
。 :)
答案 3 :(得分:0)
函数调用已被编译器优化掉了,编译器注意到你对temp没有任何作用,你的函数调用没有副作用,所以它优化了它。
尝试在temp = test();
之后添加printf,编译器将不再执行相同的优化。