【问题标题】:MSVC const correctness : spurious C4090 warningMSVC const 正确性:虚假 C4090 警告
【发布时间】:2020-06-08 10:17:42
【问题描述】:

MSVC 发出警告 C4090 关于 const 正确性,而 GCC 和 Clang 都接受它:Compiler Explorer

void dummy(void)
{
    int i[42];
    int *pi[42];
    int const *pci[42];
    memset(i, 0, sizeof i);
    memset(pi, 0, sizeof pi);
    memset(pci, 0, sizeof pci); // warning C4090: 'function': different 'const' qualifiers
}

似乎 MSVC 将pci 视为常量,但实际上并非如此。

这个错误显然是awfully old。知道如何在不关闭 C4090 的情况下解决此问题吗?

【问题讨论】:

  • 我会放弃const,这对我来说似乎毫无用处。
  • 显然 MSVC 很糟糕。它对int const pci[42]; 给出了相同的警告。也许编译器无法区分整数数组和指针数组...
  • @Lundin 误报很烦人,但我宁愿绕过编译器缺陷并被警告实际未定义的行为。
  • @diapir 相反,您应该停止使用无法修复 10 年前的错误的编译器。对于 PC 编译器,还有很多其他选择。
  • pci 转换为 void* 应该抑制警告 - memset((void*)pci, 0, sizeof pci);

标签: c pointers visual-c++ constants


【解决方案1】:

您可以在调用它的行之前禁用此警告并在之后恢复它https://godbolt.org/z/W-XR-Q

#include <string.h>

void dummy(void)
{
    int i[42];
    int *pi[42];
    const int *pci[42];

    memset(i, 0, sizeof i);
    memset(pi, 0, sizeof pi);

#pragma warning( push )
#pragma warning( disable : 4090)
    memset(pci, 0, sizeof pci); // NO warning C4090
#pragma warning( pop ) 
}

【讨论】:

  • 或者在项目范围内使用#pragma warning( disable : 4090)。此警告显然已被破坏,无法信任。
  • 我选择了#pragma warning(suppress : 4090),它禁用了下一行的警告。干杯。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-12
  • 2015-07-26
  • 1970-01-01
  • 2021-10-16
  • 1970-01-01
相关资源
最近更新 更多