繁体   English   中英

使用VC ++编译SQLite时如何解决警告?

[英]How do I address warnings when compiling SQLite with VC++?

每当我使用Visual C ++ 9编译SQLite时 ,都会收到数百条警告,例如

  • 潜在的未初始化变量
  • 从较宽的整数类型到较窄的整数类型的转换
  • 有符号/无符号整数不匹配。

我并不孤单-有一个专门针对此的SQLite FAQ问题 这个问题的答案说

  • 这些警告不会出现在SQLite开发人员使用的GCC中
  • 警告不是问题,因为团队彻底地测试了代码

我当然不能反对这些观点,但是...

  • 我不使用GCC-我使用VC ++,并且VC ++确实显示警告
  • 他们测试了使用GCC编译的代码,而我不使用GCC,因此GCC和VC ++之间可能存在一些实现定义的差异或不同级别的C标准合规性,这些都会巧妙地破坏代码,并带来严重的后果。

这就是为什么我不喜欢简单地忽略所有警告的想法的原因。

那么在编译SQLite时如何处理VC ++显示的警告?

如果实际上没有造成任何危害,为什么不使用#pragmas禁用这些警告? 还是切换到较低的警告级别(假设您拥有SQLite源作为单独的VC lib项目?)

任何使用C ++的开发人员如何处理警告? 研究收到警告的代码,确定警告是否告诉您需要了解的信息,然后根据需要更改代码。 我不确定我是否真的理解您的问题。

也许,如果您发布了特定的警告(带有代码),我们可能会为您提供有关该警告的建议。

我要说的是,使用开发人员自己从未使用过的编译器和库来编译像SQLite这样复杂的东西,注定会失败,或者至少会非常非常痛苦。 GCC在Windows上易于安装和使用(可从http://tdragon.net/recentgcc获得),那么为什么不使用它呢?

首先,请记住警告不是错误指示符。 他们在那里是为了吸引开发人员注意那些可能指示错误的内容,而没有别的。

如果该代码有效,则发出的警告数量几乎无关紧要。

如果您想放心,请查看以下警告:它们是否与VS和GCC处理不同的实现定义的行为有关? 如果是这样,您可能有问题。 但是,只要警告是关于两个编译器都相同地处理的事情(例如整数/双精度转换),就可以将其忽略。

我记得(一段时间以来,我在VS上编译SQLite时没有沉默警告),实际上所有警告都是关于内置类型之间的隐式转换的,只要开发人员知道它们正在使用,所有这些都是绝对安全的地点。

SQLite在VS上工作得很好。 该库被许多大型项目广泛使用。 经过相当广泛的测试。

在VC9解决方案资源管理器中选择文件,右键单击,选择“属性”。 然后转到C++ -> General选项卡,并将Warning level设置为Off 这将仅关闭那些文件的所有警告。

我使用的大多数外部lib文件都是这样做的:没有“修复”那些文件的好处(如果它们不是真正的bug),并且关闭警告有助于保持构建输出窗口的清洁,因此我不会错过我自己的代码中的警告。

这些警告的基本含义是:

  1. 如果将代码移植到所有基本类型(char,short,int,long,long long)的大小与原始开发人员使用和测试过的大小完全相同的环境,则该代码可能会在测试后正常工作(尽管请注意排除那些可能未初始化的变量),但是

  2. 如果您曾经将代码移植到某些基本类型与原始开发人员使用的大小不同的环境中,那么您很有可能在您所处的某些地方以神秘和违反直觉的方式破坏代码得到这些警告。 即使您在两种环境中都使用GCC,也是如此。 有关可能发生的行为的一些示例,请参见C FAQ 3.19 (请记住,C和C ++标准现在都规定了“保值”规则)。

这是草率编码的标志。 他们确实应该解决导致这些警告的大多数问题(通常,在二进制运算符之间混合有符号和无符号类型是有风险的,我敢打赌他们在这里经常这样做)。 我已经修复了过去导致此类警告的其他人的代码,使其更强大地移植到将来的环境中。 但这就是说,如果它们使用与您将使用的相同的基本类型大小进行编译和测试(如果可以链接到兼容的C语言接口,则几乎可以肯定它们的大小),那么您可能无需解决许多这些问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM