windows.h 的 C++ 问题,在 vs17 中非法声明匿名“结构”

Posted

技术标签:

【中文标题】windows.h 的 C++ 问题,在 vs17 中非法声明匿名“结构”【英文标题】:C++ Issues with windows.h, Illegal declaration of anonymous 'struct' in vs17 【发布时间】:2019-09-20 19:18:23 【问题描述】:

编译以下代码时出现以下错误:

Error C2467 illegal declaration of anonymous 'struct'
  C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\um\winnt.h 12723
Error C2133 '_IMAGE_POLICY_METADATA::Policies': unknown size
  C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\um\winnt.h 20801
Error C2467 illegal declaration of anonymous 'struct'
  C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\um\winioctl.h 4327

代码:

#include <iostream>
#include <chrono>
#include <thread>
#include <windows.h>
using namespace std;

int main()

    std::cout << "Timer!\n Enter a number of seconds: \n";
    int n;
    std::cin >> n;
    std::this_thread::sleep_for(std::chrono::milliseconds(n*1000));
    std::cout << "Timer is up";
    std::cout << '\a';
    return 0;

删除windows.h 时不会发生这些错误,因为我有点新,我可能会犯一个基本错误,但是很多教程都使用它,它根本不想工作。我使用了一个非常基本的 sn-p 代码,以便更容易确定它是代表我的错误还是其他地方的错误。

Windows 10、Visual Studio 2019 16.2.5

【问题讨论】:

如果不启用语言扩展,则无法编译 Windows 标头。它们默认启用,请确保您没有禁用它们。 尝试将#include 移到第一行 所以禁用语言扩展应该设置为false? 移动 #include 没有效果 @TobyHogg 是的。要使用&lt;windows.h&gt;,您需要将“禁用语言扩展”设置为“false”。如果这样可以解决问题,则此问题与 ***.com/questions/5489326/… 重复 【参考方案1】:

正如@FrançoisAndrieux 在 cmets 中提到的,windows.h 标头不需要启用 C/C++ -> 语言下的“禁用语言扩展”选项(切换 /Za)。

但是,如果您只想编译不需要windows.h 的简单代码,只需将其删除即可。你可以写:

#include <iostream>
#include <chrono>
#include <thread>

int main()

    std::cout << "Timer!\n Enter a number of seconds: \n";
    int n;
    std::cin >> n;
    std::this_thread::sleep_for(std::chrono::milliseconds(n*1000));
    std::cout << "Timer is up\a";
    return 0;

【讨论】:

请注意,/Za 是一个特别古老的开关。几十年前,它旨在符合“ANSI”标准,因此不再真正有用。 VS 2019 确实支持 /permissive- 开关,这是一种更现代的提高可移植性的方法,并且现代 Windows SDK 标头在启用它的情况下工作。见this Visual C++ blog post。 禁用语言扩展设置为“否”,我打算继续使用 windows.h,但添加它并测试时发生错误。 @ChuckWalbourn 确实如此。我希望 VS 团队在某个时候更改 IDE 中选项的描述,因为它不断让新手陷入其中......(或者可能将其移至 Advanced)。 @ChuckWalbourn 现在微软支持 C 标准有什么改变吗?谢谢! /Za 仍然没有改变,并产生与原始问题相同的警告。如果您在 VS 2019 16.8 中使用 /std:c11/std:c17,则不会产生任何错误。您也可以添加/permissive-。见this blog post。【参考方案2】:

这两个错误描述都与@Acorn 所说的那个开关有关。下面的链接是微软的官方文档。如果你不能以这种方式解决你的问题。也许您需要考虑使用 VS 工具来修复您的环境。

https://docs.microsoft.com/en-us/cpp/error-messages/compiler-errors-1/compiler-error-c2467?view=vs-2015 https://docs.microsoft.com/en-us/cpp/error-messages/compiler-errors-1/compiler-error-c2133?view=vs-2015

【讨论】:

以上是关于windows.h 的 C++ 问题,在 vs17 中非法声明匿名“结构”的主要内容,如果未能解决你的问题,请参考以下文章

vs2010 C#的命令行程序,怎么清屏?

C++ VS17 给出的输出与 Linux 子系统中的相同代码不同

VS2012 如何在输出窗口中打印调试信息 C++语言

VS2019修改C++标准(以支持C++17)

C++ Primer 5th笔记(chap 17 标准库特殊设施)随机数引擎 vs rand 函数

VS错误C++:不存在从 "WCHAR [260]" 转换到 "std::basic_string<char," 的适当构造函数