致命错误 C1128
错误消息
节数超过对象文件格式限制:请使用 /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
错误消息
“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;