能否通过 编译器设置 或其它方法 屏蔽或消除 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可以)。

...全文
908 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++库中。
内容概要:本文针对网型T型三电平逆变器的低电压穿越(LVRT)能力及其综合控制策略开展深入研究,重点分析电网电压跌落条件下逆变器的动态响应特性与稳定性控制方法。研究基于Simulink平台构建详细的系统仿真模型,融合改进的电流环控制策略与中点电位平衡控制算法,有效提升逆变器在故障工况下的电流跟踪精度、过流抑制能力和直流侧中点电压稳定性。通过多场景仿真验证,所提出的综合控制策略能够显著增强逆变器在低电压穿越过程中的鲁棒性与电能质量,确保新能源系统在电网扰动下的持续可靠并网运行。; 适合人群:电力电子、新能源发电、电力系统自动化等相关专业的研究生、科研人员及从事并网逆变器设计与控制的工程技术人员。; 使用场景及目标:①深入理解三电平逆变器在电网故障下的运行机理与控制挑战;②掌握低电压穿越技术中电流限幅、故障响应及中点电位平衡的核心控制方法;③应用于光伏、风电等新能源并网系统的控制策略开发与仿真验证; 阅读建议:建议结合提供的Simulink仿真模型进行动手实践,重点关注控制器参数设计、中点电位观测与调节模块的实现逻辑,并通过对比不同电压跌落深度和控制策略的仿真结果,深化对系统动态行为与控制性能的理解。
yolo算法港口码头船舶目标检测数据集 目标类别:['ship'] 中文类别:['船舶'] 训练集:16046 张 验证集:1971 张 测试集:983 张 总计:19000 张 该数据集提供了data.yaml文件,内容如下: train: ../train/images val: ../valid/images test: ../test/images nc: 1 names: ['ship'] 该数据集聚焦于港口码头及近海水域的船舶检测任务,涵盖多种类型船舶在不同天气、光照和水文条件下的真实场景。图像样本覆盖了货轮、客轮、拖船、油轮及工程船等典型船只,充分体现了海上交通与港口作业的复杂性与多样性。通过高精度标注,该数据集为海上智能监控、船舶识别与航行安全预警系统提供了高质量的数据支撑,具有重要的实际应用价值。 该数据集在训练集、验证集和测试集之间实现了科学合理的分布,训练集包含16046张图像,验证集1971张,测试集983张,总计19000张。这种分布结构确保了模型在训练过程中具备充足的样本学习能力,同时验证集与测试集规模适中,能够有效评估模型的泛化性能与稳定性,符合深度学习项目对数据划分的标准要求。 该数据集的标注工作严谨规范,所有船舶均采用精确边界框进行标注,覆盖了不同尺寸、姿态和视角下的目标实例。标注框紧密贴合船舶轮廓,未出现明显偏移或遗漏,且在复杂背景(如水面反光、雾天、桥梁遮挡)下仍保持高一致性。标注信息完整可靠,为后续模型训练提供了坚实基础。 该数据集可广泛应用于港口自动化管理、海上交通监控、船舶动态跟踪、航道安全预警以及海洋执法等领域。其丰富的场景覆盖和多样化的船舶类型使其特别适用于智慧港口建设、海上搜救系统开发及航运物流智能化升级,能够有效提升相关系统的识别准确率与响应效率,推动海洋经济数字化转型。

65,211

社区成员

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

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