问题详述:
使用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 放到最前面。
没有将 __ifdef ... 或 #pragma once 放到最前面。
#5
看了你的回复,我在家中用我的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
这是个比较有效的建议,也是我现在的规避方法。
但问题是系统属于“大规模遗留”系统(数百万行代码级别);所以这就意味着在使用这些函数时,如果不使用头文件包含的方式,则需要大量的extern,但这同样是不可接受的。而一旦使用头文件,则与上面情况没有区别。
#7
这个属于“”,而不是通常的编译警告:
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。。。
我用的是VS2008 Team Suite,好像我还用codeblock带的gcc来test过,也没错
不过编译器里有一个选项是C还是选C++来编译,我没有切换过,你try一下
我这两天又装系统,不小心装坏了,然后把盘都格了,什么都没有,现在还正在下VS2008ing。。。
#9
可以考虑用程序生成一份给C++用的头文件。
或者用程序修改旧的代码,想个算法把嵌套的extern消除。
#10
出来混,迟早要还的。
这个纯头文件的重整,没啥“没有能力对上面代码进行整改”可言的,只是一个体力活。
这个纯头文件的重整,没啥“没有能力对上面代码进行整改”可言的,只是一个体力活。
#11
我也觉得这种方式好,遗留的问题遗留的时间越长越不好。
#12
我再想点办法,实在不行就只有买服务了。
谢谢大家的建议。
谢谢大家的建议。
#1
可以把c文件编译成lib,然后加入到c++库中。
#2
用C++的屏蔽警告的高级宏屏蔽掉C1045 可以这样做吗
#3
奇怪,在VS2008没有出现所描叙的错误
#4
头文件保护宏或保护指令的问题
没有将 __ifdef ... 或 #pragma once 放到最前面。
没有将 __ifdef ... 或 #pragma once 放到最前面。
#5
看了你的回复,我在家中用我的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
这是个比较有效的建议,也是我现在的规避方法。
但问题是系统属于“大规模遗留”系统(数百万行代码级别);所以这就意味着在使用这些函数时,如果不使用头文件包含的方式,则需要大量的extern,但这同样是不可接受的。而一旦使用头文件,则与上面情况没有区别。
#7
这个属于“”,而不是通常的编译警告:
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。。。
我用的是VS2008 Team Suite,好像我还用codeblock带的gcc来test过,也没错
不过编译器里有一个选项是C还是选C++来编译,我没有切换过,你try一下
我这两天又装系统,不小心装坏了,然后把盘都格了,什么都没有,现在还正在下VS2008ing。。。
#9
可以考虑用程序生成一份给C++用的头文件。
或者用程序修改旧的代码,想个算法把嵌套的extern消除。
#10
出来混,迟早要还的。
这个纯头文件的重整,没啥“没有能力对上面代码进行整改”可言的,只是一个体力活。
这个纯头文件的重整,没啥“没有能力对上面代码进行整改”可言的,只是一个体力活。
#11
我也觉得这种方式好,遗留的问题遗留的时间越长越不好。
#12
我再想点办法,实在不行就只有买服务了。
谢谢大家的建议。
谢谢大家的建议。