0

我可以问一个问题“为什么以下代码编译失败并在第 04 行出现错误 C2371”?

它在 VS6 上成功,但在 VS2008 上失败。

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

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

05   typedef AAA FAR* LPAAA;

提前致谢。

4

4 回答 4

4

据推测,编译器给出了错误消息和代码,告诉你问题出在哪里。谷歌搜索代码显示:

'identifier' : redefinition; different basic types

您说错误在第 4 行;在这种情况下,可能标识符是AAA,并且您已经声明了其他名为AAA.

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

另外,摆脱那些typedef struct废话;这在 C 中是个坏主意,在 C++ 中完全没有意义。除非您需要支持 16 位 MS-DOS,否则也请摆脱这些FAR*废话;您只需

struct AAA {
    unsigned char a;
};
于 2012-11-16T12:53:41.087 回答
1

抱歉,我使用的名称与已在 Windows 中定义的名称冲突。似乎 VS6.0 不包括该文件。

非常感谢大家的支持。

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

定义 VC_EXTRALEAN // 从 Windows 头文件中排除很少使用的东西

于 2012-11-16T21:42:13.453 回答
0

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

于 2012-11-16T12:53:34.337 回答
0

MSDN 说错误是“标识符已声明”。

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

所以这就是原因。


在 C++ 中,只需编写

struct Aaa
{
    unsigned char      a;
};

在哪里

  • 无标签(在 C++ 中不需要)

  • 没有指针类型的 typedef(可恶,并且还会导致const正确应用的问题,例如在 Microsoft 自己的代码中),

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

此外,使用非全大写名称,以尽量减少与宏名称冲突的可能性。

这样的冲突可能与您的问题有关。

于 2012-11-16T12:55:11.870 回答