C++ 如何修复C+中的Typedef变量未识别错误+;(Visual Studio 2017)

C++ 如何修复C+中的Typedef变量未识别错误+;(Visual Studio 2017),c++,C++,我为头文件中的现有数据类型定义了几个别名类型。使用alias在我的代码(包括所述头文件)中定义变量时,alias不会被标识为类型。正在寻找解决此错误的建议。语言-C++,ID-Visual Studio 2017 头文件中的定义: #ifndef HD_DEFINES_H_DEFINE #define HD_DEFINES_H_DEFINE #include <limits.h> #ifdef __cplusplus extern "

我为头文件中的现有数据类型定义了几个别名类型。使用alias在我的代码(包括所述头文件)中定义变量时,alias不会被标识为类型。正在寻找解决此错误的建议。语言-C++,ID-Visual Studio 2017

头文件中的定义:

#ifndef HD_DEFINES_H_DEFINE      
#define HD_DEFINES_H_DEFINE      
#include <limits.h>      
#ifdef __cplusplus      
extern "C"       
{      
#endif      
typedef unsigned int HDuint;      
typedef unsigned char HDboolean;      
typedef unsigned long HDulong;      
typedef unsigned short HDushort;      
typedef int HDint;      
typedef float HDfloat;      
typedef double HDdouble;      
typedef long HDlong;      
typedef char HDchar;      
typedef unsigned int HDerror;      
typedef unsigned int HDenum;      
typedef const char *HDstring;      
typedef unsigned int HHD;      
typedef struct      
{      
    HDerror errorCode; /* The HD_ error code */      
    int internalErrorCode; /* The original internal device-generated error */      
    HHD hHD; /* The handle of the current device when the error occurred */      
} HDErrorInfo;   
\ifndef HD\u DEFINE\u H\u DEFINE
#定义HD_定义H_定义
#包括
#ifdef_uucplusplus
外部“C”
{      
#恩迪夫
typedef unsigned int HDuint;
typedef无符号字符HDboolean;
typedef无符号长HDulong;
typedef无符号短HDushort;
typedefint-HDint;
typedef float-HDfloat;
typedef-double-HDdouble;
typedef长HDlong;
typedef-char-HDchar;
typedef unsigned int HDerror;
typedef unsigned int HDenum;
typedef const char*HDstring;
***
类型定义结构
{      
HDerror error code;/*HD_uu错误代码*/
int internalErrorCode;/*原始内部设备生成的错误*/
***
}HDErrorInfo;
代码中的用法:(代码包括所述头文件)

#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
结构设备数据{
HDM_按钮状态;
hduVector3Dd m_设备位置;
HDErrorInfo m_错误
};
错误消息:

<error-type> HDboolean
variable "HDboolean" is not a type name
HDboolean
变量“HDboolean”不是类型名

typedef看起来非常好,因此,我的最佳猜测是,它们没有真正包括在内,因为一些ifdef混乱,比如意外地从另一个文件复制和粘贴了ifndef HD_DEFINE_H_DEFINE,因此多个头具有相同的定义(将导致第二个头不包括在内)之类的内容

检查您的内容是否真的包含在内的方法非常简单,只需在问题的typedef之前放一些垃圾。类似于:

foo foo foo
typedef unsigned char HDboolean;

然后再次构建这个项目。如果它没有失败,开始查看你的IFDES和它们有什么不对。可能考虑使用“如果有问题的编译器支持它。

请进行修改。错误无法用给定的代码重现,并且错误可能出现在您没有显示的代码中。您的
typedef
s很好。我猜要么1)使用类型的代码不是
#包含定义它们的头文件,要么2)头文件h作为一个错误的头保护,它会导致定义被跳过。很难说没有。感谢回复。编辑代码以获取更多详细信息。它仍然可以编译(一旦我去掉
#包括
我没有的文件,并注释掉
m_devicePosition的声明,因为我没有它的类型定义)。请记住,我们需要一个最小且可复制的示例。可复制:将代码复制到文件(或在线编译器)中并编译它。确保编译错误发生在您给我们的代码中。最小值:去掉不需要复制的行,例如大多数
#include
s。除了编译器支持
#pragma once
,您还应该确保您的构建系统不会使用巧妙的符号链接和po破坏
#pragma once
orly同步时钟。由于OP使用的是Visual Studio,请使用
#pragma消息(“某些消息”)
以确定是否包含文件。pragma中的消息将显示在编译器输出中。不需要在代码中添加导致编译失败的内容。我必须承认,我从来没有遇到过一次损坏的pragma。至于使用pragma-mesage检查它,或者简单地将垃圾放在那里,这真的很重要吗倾向于只键入一些垃圾邮件,当然,它可以与邮件一起检查。如果您想知道最终的确切包含顺序,则邮件可能更有用,但这个顺序很重要这一事实通常意味着您已经做错了。简单地将垃圾邮件放在那里,真的很重要吗?--我认为停止是不明智的p除非调用的是
#error
static\u assert
,否则编译不会发生。在代码中出错是危险的。在代码中出错是危险的-这很公平
foo foo foo
typedef unsigned char HDboolean;