我是否有一个问题为“为什么以下代码编译失败,错误C2371在第04行?”
它在VS6上取得了成功但在VS2008上失败了。
我试图在第05行注释,仍然有这个编译错误。
01 typedef struct tagAAA
02 {
03 unsigned char a;
04 } AAA;
05 typedef AAA FAR* LPAAA;
提前致谢。
答案 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中包含以下宏
答案 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有点古老)。
此外,使用非全大写名称,以最小化与宏名称冲突的可能性。
这样的冲突可能会涉及您的问题。