如何调试“INT_MAX未声明”

时间:2011-07-23 15:28:48

标签: c debugging c-preprocessor

printf(INT_MAX);

limits.h包含在内,由于某种原因,它不适用于此特定项目。在我的测试平台中,它只是起作用。我不知道如何解决这个问题,除了删除整个项目中的每个文件,直到它开始工作。这将是一项不人道的工作。如何更快地找到此错误?造成这种情况的常见原因是什么?

3 个答案:

答案 0 :(得分:12)

我假设您已经搜索了自己的代码并为INT_MAX可能未定义的实例构建系统。

如果可能的话,找到一种只编译一个源文件(.c)的方法,这样你的迭代速度就会提高。如果您的Makefile(或您使用的任何内容)已经只编译了更改的文件,而不是所有内容,那就足够了。

然后,在有问题的文件中,在第一个#include之前和每个#include之后添加:

#ifndef INT_MAX
#error INT_MAX not defined at this point
#endif

然后重建该模块并查看错误发生的位置。

如果失败,请在代码中添加上面的代码片段以查看未定义的位置。

如果事实证明您的<limits.h>未定义它,则至少有两种可能性:

  • 您的平台不符合C标准,至少在您使用它的方式;也许您需要使用特定的编译器开关来获得C标准?
  • 您的代码包含与标准代码不同的limits.h

快乐的黑客攻击。

PS。如果您需要完成删除文件以查找问题的过程,请注意您可以使用二进制搜索来加快速度:首先删除一半文件,如果问题仍然存在,您知道它在剩余的文件中,如果没有,则在您删除的文件中,或者很少在两组文件之间的交互中。然后使用适当的文件集进行迭代,直到将其缩小到足够小的范围。

答案 1 :(得分:12)

确保include指令是

#include <limits.h>

#include "limits.h"

向我们展示一个展示问题的完整程序,以及您收到的确切错误消息。复制并粘贴它们。如果您正在调用printf(),请不要忘记

#include <stdio.h>

尝试编译并运行此程序:

#include <stdio.h>
#include <limits.h>

int main(void)
{
    printf("INT_MAX = %d\n", INT_MAX);
    return 0;
}

它应该正常工作,没有警告或错误消息。如果没有,那么您的编译系统可能会出现问题,或者安装或配置它的方式,或者您使用它的方式。

答案 2 :(得分:2)

此代码永远不会起作用,因为printf将指向格式字符串的指针作为其第一个参数。 INT_MAX不是指向格式字符串的指针,而是一个整数。

你想要的是printf("%d", INT_MAX)