所以这是结构的预处理输出:
typedef struct RPT_Item
{
wchar_t *fullPath;
RPT_ItemFlags_t itemFlags;
int isComposite;
const void *reserved;
} RPT_Item_t;
Visual Studio抱怨因为wchar_t
没有被定义,它自己的神秘方式:
error C2016: C requires that a struct or union has at least one member
我查看了项目文件以及出现错误的特定C文件,我可以确认“将wchar_t视为内置类型设置为YES ”。
如果我使用typedef定义类型,它编译得很好。
我使用了预处理器输出,因此我可以排除一些讨厌的预处理器#define
技巧扮演主要角色。
此项目包含许多低级别黑客攻击,例如CRT未链接(/NODEFAULTLIB
)。
大多数代码不是由我编写的,我的任务是从使用wchar_t的公共头中删除对wchar.h的引用,因为VS将其视为内置类型的默认值。 (此特定模块仅在Windows上构建。)
我完全没有想法了。是否存在可能会干扰的编译器选项或编译指示?或者甚至可能是编译器错误?
答案 0 :(得分:3)
Microsoft直到VS 2013才明确记录此内容,但the docs for /Zc:wchar_t
says
编译C代码时不支持
wchar_t
类型。
似乎包含来自运行时或SDK的几乎任何标头都会使用以下顺序将wchar_t
输入unsigned short
:
#ifndef _WCHAR_T_DEFINED
typedef unsigned short wchar_t;
#define _WCHAR_T_DEFINED
#endif
您可能希望在使用wchar_t
的文件中执行类似操作。
请注意,在编译C ++文件时,如果/Zc:wchar_t
生效,则编译器会预定义_WCHAR_T_DEFINED
。如果/Zc:wchar_t-
生效,它不会 - 所以上面的代码片段也可以很好地与C ++一起使用(无论如何对于MSVC - 我不知道如果你正在寻找便携式的东西,其他编译器可能会如何处理这个问题)。
记录了_WCHAR_T_DEFINED
宏: