能否通过 编译器设置 或其它方法 屏蔽或消除 MS VC C1045 错误?

bluejugar 2010-01-27 12:21:25
环境:Windows XP SP2, VC2005 SP1
问题详述:
使用C语言模式编译下面示例代码,没有问题。
使用C++模式编译下面示例代码,出现C1045问题:
Microsoft Visual Studio8\VC\include\sal.h(226):fatal error C1045: compiler limit: linkage specifications nested too deeply
代码示例:
#ifdef __cplusplus
extern "C" {
#endif

#ifdef __cplusplus
extern "C" {
#endif

#ifdef __cplusplus
extern "C" {
#endif

#ifdef __cplusplus
extern "C" {
#endif

#ifdef __cplusplus
extern "C" {
#endif

#ifdef __cplusplus
extern "C" {
#endif

#ifdef __cplusplus
extern "C" {
#endif

#ifdef __cplusplus
extern "C" {
#endif

#ifdef __cplusplus
extern "C" {
#endif

#include <stdio.h>

#ifdef __cplusplus
}
#endif

#ifdef __cplusplus
}
#endif

#ifdef __cplusplus
}
#endif

#ifdef __cplusplus
}
#endif

#ifdef __cplusplus
}
#endif

#ifdef __cplusplus
}
#endif

#ifdef __cplusplus
}
#endif

#ifdef __cplusplus
}
#endif

#ifdef __cplusplus
}
#endif

int main()
{
return 0;
}
错误描述已经给个够清楚,当extern嵌套层数超过9层时,在C++模式下即会出现这种错误。

上面示例代码实际上是大规模头文件嵌套后造成的,但由于代码属于大规模遗留系统,实际上没有能力对上面代码进行整改;所以问题就变为:
是否可以不修改上面的示例代码,而是比如通过修改编译器设置,或者在这代码外围加上一些其它代码,让上面这段代码在C++模式下编译通过?如果可以?如何修改?

PS:
VC6/2005下不可以undef编译器内置宏__cplusplus(但gcc可以)。

...全文
822 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
bluejugar 2010-01-30
  • 打赏
  • 举报
回复
我再想点办法,实在不行就只有买服务了。

谢谢大家的建议。
bluejugar 2010-01-28
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wangchentangjuan 的回复:]
用C++的屏蔽警告的高级宏屏蔽掉C1045 可以这样做吗
[/Quote]
这个属于“”,而不是通常的编译警告:
fatal error C1045: 编译器限制 : 链接规范嵌套太深

如果“#pragma warning(disable: 1045)”,则会多一条提示(;.;):
warning C4616: #pragma warning: 警告编号“1045”不是有效的编译器警告
bluejugar 2010-01-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 whg01 的回复:]
可以把c文件编译成lib,然后加入到c++库中。
[/Quote]
这是个比较有效的建议,也是我现在的规避方法。

但问题是系统属于“大规模遗留”系统(数百万行代码级别);所以这就意味着在使用这些函数时,如果不使用头文件包含的方式,则需要大量的extern,但这同样是不可接受的。而一旦使用头文件,则与上面情况没有区别。
bluejugar 2010-01-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 traceless 的回复:]
奇怪,在VS2008没有出现所描叙的错误
[/Quote]
看了你的回复,我在家中用我的VS2008试了一下,报了同样的错误:
1>c:\program files\microsoft visual studio 9.0\vc\include\sal.h(1479) : fatal error C1045: 编译器限制 : 链接规范嵌套太深

PS:
1、VS2008详细版本:
(Microsoft Visual Studio 2008
版本 9.0.21022.8 RTM
Microsoft .NET Framework
版本 3.5

已安装的版本: Professional

Microsoft Visual C++ 2008 91986-031-5000002-60487
Microsoft Visual C++ 2008)

2、也许你需要把上面的内容放到.cpp中?~~~
cattycat 2010-01-28
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 whg01 的回复:]
可以考虑用程序生成一份给C++用的头文件。
或者用程序修改旧的代码,想个算法把嵌套的extern消除。
[/Quote]

我也觉得这种方式好,遗留的问题遗留的时间越长越不好。
taodm 2010-01-28
  • 打赏
  • 举报
回复
出来混,迟早要还的。
这个纯头文件的重整,没啥“没有能力对上面代码进行整改”可言的,只是一个体力活。
whg01 2010-01-28
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 bluejugar 的回复:]
引用 1 楼 whg01 的回复:
可以把c文件编译成lib,然后加入到c++库中。

这是个比较有效的建议,也是我现在的规避方法。

但问题是系统属于“大规模遗留”系统(数百万行代码级别);所以这就意味着在使用这些函数时,如果不使用头文件包含的方式,则需要大量的extern,但这同样是不可接受的。而一旦使用头文件,则与上面情况没有区别。
[/Quote]
可以考虑用程序生成一份给C++用的头文件。
或者用程序修改旧的代码,想个算法把嵌套的extern消除。
traceless 2010-01-28
  • 打赏
  • 举报
回复
哦 如果只是LZ给出的嵌套层数,我记得我先是在cpp文件编译通过,然后还把cpp改成c来编译,通过

我用的是VS2008 Team Suite,好像我还用codeblock带的gcc来test过,也没错

不过编译器里有一个选项是C还是选C++来编译,我没有切换过,你try一下

我这两天又装系统,不小心装坏了,然后把盘都格了,什么都没有,现在还正在下VS2008ing。。。
dengsf 2010-01-27
  • 打赏
  • 举报
回复
头文件保护宏或保护指令的问题
没有将 __ifdef ... 或 #pragma once 放到最前面。
traceless 2010-01-27
  • 打赏
  • 举报
回复
奇怪,在VS2008没有出现所描叙的错误
wangchentangjuan 2010-01-27
  • 打赏
  • 举报
回复
用C++的屏蔽警告的高级宏屏蔽掉C1045 可以这样做吗
whg01 2010-01-27
  • 打赏
  • 举报
回复
可以把c文件编译成lib,然后加入到c++库中。

65,209

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧