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<windows.h>
,您需要将“禁用语言扩展”设置为“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 中非法声明匿名“结构”的主要内容,如果未能解决你的问题,请参考以下文章
C++ VS17 给出的输出与 Linux 子系统中的相同代码不同
C++ Primer 5th笔记(chap 17 标准库特殊设施)随机数引擎 vs rand 函数
VS错误C++:不存在从 "WCHAR [260]" 转换到 "std::basic_string<char," 的适当构造函数