2011-03-22 157 views
0

我在头文件中定义了以下方法C函数不返回值?

unsigned char test(void); 

实现:

unsigned char test() 
{ 
    unsigned char value = 0xFF; 
    return value;  
} 

当我这样称呼它:返回

unsigned char temp; 
temp = test(); 

没有什么???我用断点介入它。最后,变量值的值为0xFF,但永远不会返回到临时值?

我不习惯普通的老C ......只有C++,在声明方法时可能会有某种细微的差别。

任何帮助将不胜感激!

+0

你怎么知道它没有返回到'temp'?你的意思是说,当你打印'temp'到控制台,它的值不是'0x49'?它有什么价值? – 2011-03-22 21:40:12

+0

这是非常不清楚你的意思是“永远不会回到临时”。请解释确切的问题是什么。 – julkiewicz 2011-03-22 21:40:46

+3

您提供的代码将返回值。请你可以发布真实的代码,显示问题的代码。 – 2011-03-22 21:40:59

回答

2

确定它的调试器没有用户错误? 大多数调试器在实际执行任务之前不会显示变量“temp”的值,直到下一行代码。

+0

你好,正如上面在评论中所述,我正在通过代码行。我不相信这是一个IDE错误,因为我总是成功显示char值。 – Dave 2011-03-22 21:57:18

+0

说真的,不要相信 - 只是测试它。放置一些依赖'temp'的值的代码,看看行为是否合适。禁用优化也可以帮助调试器。 – julkiewicz 2011-03-22 22:00:46

+0

奇怪。出于好奇,你在使用什么编译器? 我试过每个我能想到的编译器标志,我在打印时得到一个临时值。 – MarcB 2011-03-22 22:04:27

2

如果启用优化,temp可以保存在寄存器中,有时调试器在查找和显示这些值时会遇到问题。实际上,如果你不在任何地方使用它,编译器可以很好地丢弃返回值。确保您的代码在进行调试时没有进行任何优化编译。

或者,使用男士已知的最早的方法进行调试:printf。 :)

6

我想你只是看到一个聪明的编译器。如果您的变量在分配后从未被使用,那么它只是被优化了。不过,该功能仍然被称为可能的副作用。

如果您将变量更改为全局变量,编译器无法知道您不会使用它,因此它会执行赋值操作。

我想如果你在作业后加上了printf或者声明了tmp变量volatile,你也会在调试器中观察到这个任务。

0

它的函数调用已被编译器优化掉了,编译器注意到你对temp没有任何作用,并且你的函数调用没有副作用,所以它优化了它。

尝试在做0123'之后再添加一个printf,编译器将不再执行相同的优化。