因typedef而导致C2371错误

时间:2012-11-16 12:43:47

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

我是否有一个问题为“为什么以下代码编译失败,错误C2371在第04行?”

它在VS6上取得了成功但在VS2008上失败了。

我试图在第05行注释,仍然有这个编译错误。

01   typedef struct tagAAA
02   {
03       unsigned char      a;
04   } AAA;

05   typedef AAA FAR* LPAAA;

提前致谢。

4 个答案:

答案 0 :(得分:4)

据推测,编译器提供了一条错误消息以及一个代码,它告诉您问题所在。谷歌搜索代码揭示:

'identifier' : redefinition; different basic types

你说错误是在第4行;在这种情况下,大概是标识符AAA,并且您已经宣布了其他名为AAA的内容。

至于为什么它在15年前的标准编译器上取得成功,你将不得不问历史学家。

另外,摆脱typedef struct胡说八道;它在C中是一个坏主意,在C ++中完全没有意义。除非你需要支持16位MS-DOS,否则也要摆脱FAR*废话;你只需要

struct AAA {
    unsigned char a;
};

答案 1 :(得分:1)

对不起伙计们,我使用与Windows中已定义的名称相同的名称冲突。 似乎VS6.0没有包含该文件。

非常感谢您的支持。

另一个选择是在stdafx.h中包含以下宏

定义VC_EXTRALEAN //从Windows标题中排除很少使用的东西

答案 2 :(得分:0)

您没有向我们展示FAR的定义(此处只能是一个宏)。我认为在8086(16位MS / DOS)时代微软标题中有这样一个宏。我只是在猜测,但如果他们保留一段时间以避免破坏旧代码并且只在VC6之后将其删除,我不会感到惊讶。

答案 3 :(得分:0)

MSDN says错误是"标识符已经声明。"

这意味着标识符AAA已经被声明。

这就是原因。


在C ++中,只需编写

即可
struct Aaa
{
    unsigned char      a;
};

,其中

  • 没有标签(C ++中不需要)

  • 没有指针类型的typedef(令人厌恶,也导致正确应用const的问题,例如在Microsoft自己的代码中),

  • 没有FAR(MS-DOS有点古老)。

此外,使用非全大写名称,以最小化与宏名称冲突的可能性

这样的冲突可能会涉及您的问题。