C1128 和C4503

致命错误 C1128

Visual Studio 2005
此主题尚未评级 - 评价此主题

错误消息
节数超过对象文件格式限制:请使用 /bigobj 进行编译

.obj 文件超出了可允许的节数,COFF 对象文件格式限制。

达到这一节限制可能是因为使用了 /Gy 和调试版本;/Gy 导致函数进入自己的 COMDAT 节。在调试版本中,每一 COMDAT 函数都有一个调试信息节。

内联函数过多时也可能导致 C1128。

若要更正此错误,请将源文件划分为多个源代码文件,在不使用 /Gy 的情况下进行编译,或使用/bigobj(增加 .obj 文件中的节数量)进行编译。如果不使用 /Gy 进行编译,则需要单独指定优化,因为 /O2/O1 均暗指 /Gy

请尽可能不使用调试信息进行编译。

可能需要在单独的源代码文件中具有特定的模板实例,而不是让编译器发出它们。

当移植代码时,C1128 最可能在使用 Itanium (IPF) 编译器时出现,然后是使用 x64 编译器时,再后是使用 x86 编译器时。IPF 将至少 4 个节与用 /Gy 编译的或从模板或类内联的各个函数相关联:代码、函数说明符、pdata 和调试信息,以及可能的 xdata。除函数说明符外,x64 是相同的。X86 没有 pdata。

编译器警告(等级 1)C4503

Visual Studio 2005
此主题尚未评级 - 评价此主题

错误消息
“identifier”: 修饰名的长度超出限制,名称被截断

修饰名的长度超出编译器限制 (4096),被截断了。若要避免出现此警告和截断,请减少所使用的参数数目或标识符的名称长度。

发出此警告的一种情况是当代码重复包含专用于模板的模板时。例如,映射的映射(来自标准 C++ 库)。在这种情况下,可以将您的 typedef 设置为一个包含映射的类型(例如,结构)。

不过,您可能决定不重构自己的代码。可以发布生成 C4503 的应用程序,但如果收到关于截断符号的链接时错误,确定错误中符号的类型将更加困难。调试也将更加困难;调试器将符号名称映射到类型名称也会有困难。但是,程序的正确性不受截断名称的影响。

下面的示例生成 C4503:

// C4503.cpp
// compile with: /W1 /EHsc /c
// C4503 expected
#include <string>
#include <map>

class Field{};

typedef std::map<std::string, Field> Screen;
typedef std::map<std::string, Screen> WebApp;
typedef std::map<std::string, WebApp> WebAppTest;
typedef std::map<std::string, WebAppTest> Hello;
Hello MyWAT;

下面的示例显示了一种通过重写代码来解决 C4503 的方法:

// C4503b.cpp
// compile with: /W1 /EHsc /c
#include <string>
#include <map>

class Field{};
struct Screen2 {
   std::map<std::string, Field> Element;
};

struct WebApp2 {
   std::map<std::string, Screen2> Element;
};

struct WebAppTest2 {
   std::map<std::string, WebApp2> Element;
};

struct Hello2 {
   std::map<std::string, WebAppTest2> Element;
};

Hello2 MyWAT2;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值