我正在尝试使用msvs 2010构建在以下git中找到的项目:
https://github.com/Joonhwan/exprtk
问题是当我在exprtk.hpp文件中注释掉第48行'#define exprtk_lean_and_mean'时,我收到以下编译错误:
Error 1 error C1128: number of sections exceeded object file format limit : compile with /bigobj
搜索错误,似乎表明已编译的翻译单元已编译为大于仲裁限制的内容,并且在命令行中添加“bigobj”应该可以解决问题(它可以解决)。用gcc(4.3)编译代码,没有故障。
我的问题是:
c ++是否限制了翻译单元中可以使用的类型数量?
这个项目代码的布局方式是不好的做法? (谷歌搜索时我注意到很多升级库都有同样的问题,例如:Boost.Sprit)
答案 0 :(得分:14)
c ++是否限制了翻译单元中可以使用的类型数量?
请注意,对于特定实现,此类参数的最大值保持打开状态。该标准仅强制实施必须支持的最低要求。实现将记录它支持的最大值,在这种情况下,MSVC实现会这样做。
这些是在C ++标准的特殊部分中定义的。
附件B - 实施数量
由于计算机是有限的,C ++实现不可避免地受到限制 他们可以在程序的大小 成功处理。的每 实施应记录这些 已知的局限性。这个 文件可以引用固定限制 它们存在的地方,说如何计算 变量限制作为函数 可用资源,或者说固定 限制不存在或未知。
- 醇>
限制可能会限制包含下述内容或数量的数量 其他。 以下括号内的数字 建议将每个数量作为 该数量的最小值。但是, 这些数量只是指导原则 并且不确定合规性。
- 嵌套复合语句的级别, 迭代控制结构,和 选择控制结构[256]。
- 嵌套级别的条件 包含[256]。
- 指针,数组和 函数声明符(在任何 组合)修改算术, 结构,联合或不完整类型 在声明[256]。
- 嵌套 带括号的表达式的级别 在一个完整的表达[256]。
- 内部字符数 标识符或宏名称[1 024]。
- 外部字符数 标识符[1 024]。
- 外部 一个翻译单元中的标识符 [65 536]。
- 带块的标识符 范围在一个块[1 024]中声明。
- 宏标识符同时 在一个翻译单位中定义[65 536]。
- 一个功能中的参数 定义[256]。
- 一个参数 函数调用[256]。**
- 参数in 一个宏定义[256]。
- 一次宏调用中的参数 [256]。
- 一个逻辑中的字符 源线[65 536]。
- 中的人物 字符串文字或宽 字符串文字(连接后) [65 536]。
- 物体的大小[262 144] 即可。
- #include的嵌套级别 文件[256]。
- 案例标签 switch语句(不包括 任何嵌套的switch语句)[16 384]。
- 单个数据成员 阶级,结构或联合[16 384]。
- 枚举常量在一个单独的 枚举[4 096]。
- 级别 嵌套类,结构或联合 单一的定义 struct-declaration-list [256]。
- 由atexit()[32]注册的函数。
- 直接和间接基类[16 384]。
- 直接基类 单班[1024]。
- 成员 在一个班级[4 096]中宣布。
- 最终覆盖虚拟功能 一个类,可访问与否[16 384]。
- 直接和间接的虚拟基础 班级[1 024]。
- 静态成员 班级[1 024]。
- 朋友声明 在课堂上[4 096]。
- 访问控制 类[4 096]中的声明。
- 构造函数中的成员初始值设定项 定义[6 144]。
- 范围 一个标识符的资格 [256]。
- 嵌套外部 规格[1 024]。
- 模板 模板声明中的参数[1 024]。
- 递归嵌套模板 实例化[17]。
- 每个处理人员 尝试阻止[256]。
- 扔 单一功能的规格 声明[256]。
答案 1 :(得分:7)
限制是旧版本的MSVC和相应的链接器使用的OBJ格式。因此,虽然这种限制是任意的,但它不能成为新版本编译器的默认行为。查看/bigobj选项的说明:
在Visual C ++ 2005之前发布的链接器无法读取使用/ bigobj生成的.obj文件。