8

我正在尝试使用 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) 编译代码,没有故障。

我的问题是:

  1. c++ 是否对翻译单元中可以拥有的类型数量进行了限制?

  2. 这个项目中代码的布局方式是不好的做法吗?(谷歌搜索时,我注意到很多 boost 库都有同样的问题,例如:Boost.Sprit)

4

2 回答 2

14

c++ 是否对翻译单元中可以拥有的类型数量进行了限制?

请注意,这些参数的最大值对于特定的实现是开放的。该标准仅强制实施必须支持的最低要求。实现将记录它支持的最大值,在这种情况下,MSVC 实现会这样做。

这些是在 C++ 标准的一个特殊部分中定义的。

附件 B - 实施数量

  1. 因为计算机是有限的,C++ 实现不可避免地受限于它们可以成功处理的程序的大小。每个实施都应在已知的情况下记录这些限制。本文档可能会引用存在的固定限制,说明如何根据可用资源计算可变限制,或者说固定限制不存在或未知。

  2. 这些限制可能会限制包括以下描述的数量或其他数量。建议将每个数量后面的括号中的数字作为该数量的最小值。但是,这些数量仅作为指导,并不能确定合规性。
    — 复合语句、迭代控制结构和选择控制结构的嵌套级别 [256]。
    — 条件包含的嵌套级别 [256]。
    — 指针、数组和函数声明符(任意组合)修改声明中的算术、结构、联合或不完整类型 [256]。
    — 在完整表达式中嵌套括号表达式的级别 [256]。
    — 内部标识符或宏名称中的字符数 [1 024]。
    — 外部标识符中的字符数 [1 024]。
    — 一个翻译单元中的外部标识符 [65 536]。
    — 在一个块中声明的具有块范围的标识符 [1 024]。
    — 在一个翻译单元中同时定义的宏标识符 [65 536]。
    — 一个函数定义中的参数 [256]。
    — 一个函数调用中的参数 [256]。**
    — 一个宏定义中的参数 [256]。
    — 一个宏调用中的参数 [256]。
    — 一个逻辑源代码行中的字符 [65 536]。
    — 字符串文字或宽字符串文字中的字符(连接后)[65 536]。
    对象的大小 [262 144]
    — #include 文件的嵌套级别 [256]。
    — switch 语句的 case 标签(不包括任何嵌套 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]。

于 2012-05-14T05:56:19.787 回答
7

限制在于旧版本的 MSVC 和相应链接器使用的 OBJ 格式。因此,虽然这个限制是任意的,但它不能成为新版本编译器的默认行为。查看/bigobj选项的描述:

在 Visual C++ 2005 之前发布的链接器无法读取使用 /bigobj 生成的 .obj 文件。

于 2012-05-14T05:56:32.257 回答