即使启用该选项,wchar_t也不会被视为内置类型

时间:2014-06-23 17:02:29

标签: visual-c++ visual-c++-2008

所以这是结构的预处理输出:

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上构建。)

我完全没有想法了。是否存在可能会干扰的编译器选项或编译指示?或者甚至可能是编译器错误?

1 个答案:

答案 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宏: