我可以问一个问题“为什么以下代码编译失败并在第 04 行出现错误 C2371”?
它在 VS6 上成功,但在 VS2008 上失败。
我试图注释掉第 05 行,仍然有这个编译错误。
01 typedef struct tagAAA
02 {
03 unsigned char a;
04 } AAA;
05 typedef AAA FAR* LPAAA;
提前致谢。
我可以问一个问题“为什么以下代码编译失败并在第 04 行出现错误 C2371”?
它在 VS6 上成功,但在 VS2008 上失败。
我试图注释掉第 05 行,仍然有这个编译错误。
01 typedef struct tagAAA
02 {
03 unsigned char a;
04 } AAA;
05 typedef AAA FAR* LPAAA;
提前致谢。
据推测,编译器给出了错误消息和代码,告诉你问题出在哪里。谷歌搜索代码显示:
'identifier' : redefinition; different basic types
您说错误在第 4 行;在这种情况下,可能标识符是AAA
,并且您已经声明了其他名为AAA
.
至于为什么它在一个有 15 年历史的预标准编译器上取得成功,你得问问历史学家。
另外,摆脱那些typedef struct
废话;这在 C 中是个坏主意,在 C++ 中完全没有意义。除非您需要支持 16 位 MS-DOS,否则也请摆脱这些FAR*
废话;您只需
struct AAA {
unsigned char a;
};
抱歉,我使用的名称与已在 Windows 中定义的名称冲突。似乎 VS6.0 不包括该文件。
非常感谢大家的支持。
另一种选择是在 stdafx.h 中包含以下宏
您没有向我们展示FAR
(此处只能是宏)的定义。我认为在 8086(16 位 MS/DOS)时代的 Microsoft 标头中有这样一个宏。我只是猜测,但如果他们将它保留一段时间以避免破坏旧代码,并且在 VC6 之后才摆脱它,我不会感到惊讶。
MSDN 说错误是“标识符已声明”。
这意味着标识符 ,AAA
已经被声明。
所以这就是原因。
在 C++ 中,只需编写
struct Aaa
{
unsigned char a;
};
在哪里
无标签(在 C++ 中不需要)
没有指针类型的 typedef(可恶,并且还会导致const
正确应用的问题,例如在 Microsoft 自己的代码中),
没有FAR
(MS-DOS 有点古老)。
此外,使用非全大写名称,以尽量减少与宏名称冲突的可能性。
这样的冲突可能与您的问题有关。