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

时间:2022-09-30 14:07:03
环境: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可以)。

12 个解决方案

#1


可以把c文件编译成lib,然后加入到c++库中。

#2


 用C++的屏蔽警告的高级宏屏蔽掉C1045 可以这样做吗

#3


奇怪,在VS2008没有出现所描叙的错误

#4


头文件保护宏或保护指令的问题
没有将 __ifdef ... 或 #pragma once 放到最前面。

#5


引用 3 楼 traceless 的回复:
奇怪,在VS2008没有出现所描叙的错误

看了你的回复,我在家中用我的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中?~~~

#6


引用 1 楼 whg01 的回复:
可以把c文件编译成lib,然后加入到c++库中。

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

但问题是系统属于“大规模遗留”系统(数百万行代码级别);所以这就意味着在使用这些函数时,如果不使用头文件包含的方式,则需要大量的extern,但这同样是不可接受的。而一旦使用头文件,则与上面情况没有区别。

#7


引用 2 楼 wangchentangjuan 的回复:
用C++的屏蔽警告的高级宏屏蔽掉C1045 可以这样做吗

这个属于“”,而不是通常的编译警告:
fatal error C1045: 编译器限制 : 链接规范嵌套太深

如果“#pragma warning(disable: 1045)”,则会多一条提示(;.;):
warning C4616: #pragma warning: 警告编号“1045”不是有效的编译器警告

#8


哦 如果只是LZ给出的嵌套层数,我记得我先是在cpp文件编译通过,然后还把cpp改成c来编译,通过

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

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

我这两天又装系统,不小心装坏了,然后把盘都格了,什么都没有,现在还正在下VS2008ing。。。

#9


引用 6 楼 bluejugar 的回复:
引用 1 楼 whg01 的回复:
可以把c文件编译成lib,然后加入到c++库中。

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

但问题是系统属于“大规模遗留”系统(数百万行代码级别);所以这就意味着在使用这些函数时,如果不使用头文件包含的方式,则需要大量的extern,但这同样是不可接受的。而一旦使用头文件,则与上面情况没有区别。

可以考虑用程序生成一份给C++用的头文件。
或者用程序修改旧的代码,想个算法把嵌套的extern消除。

#10


出来混,迟早要还的。
这个纯头文件的重整,没啥“没有能力对上面代码进行整改”可言的,只是一个体力活。

#11


引用 9 楼 whg01 的回复:
可以考虑用程序生成一份给C++用的头文件。
或者用程序修改旧的代码,想个算法把嵌套的extern消除。


我也觉得这种方式好,遗留的问题遗留的时间越长越不好。

#12


我再想点办法,实在不行就只有买服务了。

谢谢大家的建议。

#1


可以把c文件编译成lib,然后加入到c++库中。

#2


 用C++的屏蔽警告的高级宏屏蔽掉C1045 可以这样做吗

#3


奇怪,在VS2008没有出现所描叙的错误

#4


头文件保护宏或保护指令的问题
没有将 __ifdef ... 或 #pragma once 放到最前面。

#5


引用 3 楼 traceless 的回复:
奇怪,在VS2008没有出现所描叙的错误

看了你的回复,我在家中用我的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中?~~~

#6


引用 1 楼 whg01 的回复:
可以把c文件编译成lib,然后加入到c++库中。

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

但问题是系统属于“大规模遗留”系统(数百万行代码级别);所以这就意味着在使用这些函数时,如果不使用头文件包含的方式,则需要大量的extern,但这同样是不可接受的。而一旦使用头文件,则与上面情况没有区别。

#7


引用 2 楼 wangchentangjuan 的回复:
用C++的屏蔽警告的高级宏屏蔽掉C1045 可以这样做吗

这个属于“”,而不是通常的编译警告:
fatal error C1045: 编译器限制 : 链接规范嵌套太深

如果“#pragma warning(disable: 1045)”,则会多一条提示(;.;):
warning C4616: #pragma warning: 警告编号“1045”不是有效的编译器警告

#8


哦 如果只是LZ给出的嵌套层数,我记得我先是在cpp文件编译通过,然后还把cpp改成c来编译,通过

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

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

我这两天又装系统,不小心装坏了,然后把盘都格了,什么都没有,现在还正在下VS2008ing。。。

#9


引用 6 楼 bluejugar 的回复:
引用 1 楼 whg01 的回复:
可以把c文件编译成lib,然后加入到c++库中。

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

但问题是系统属于“大规模遗留”系统(数百万行代码级别);所以这就意味着在使用这些函数时,如果不使用头文件包含的方式,则需要大量的extern,但这同样是不可接受的。而一旦使用头文件,则与上面情况没有区别。

可以考虑用程序生成一份给C++用的头文件。
或者用程序修改旧的代码,想个算法把嵌套的extern消除。

#10


出来混,迟早要还的。
这个纯头文件的重整,没啥“没有能力对上面代码进行整改”可言的,只是一个体力活。

#11


引用 9 楼 whg01 的回复:
可以考虑用程序生成一份给C++用的头文件。
或者用程序修改旧的代码,想个算法把嵌套的extern消除。


我也觉得这种方式好,遗留的问题遗留的时间越长越不好。

#12


我再想点办法,实在不行就只有买服务了。

谢谢大家的建议。