使用MSVS 2010和C++标准构建问题

Gel*_*tor 8 c++ standards compiler-errors visual-c++

我正在尝试构建,使用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
Run Code Online (Sandbox Code Playgroud)

谷歌搜索错误,似乎表明编译的翻译单元已编译为大于仲裁限制的东西,并且在命令行中添加'bigobj'应该解决问题(它会这样做).使用gcc(4.3)编译代码,没有任何故障.

我的问题是:

  1. c ++是否限制了翻译单元中可以使用的类型数量?

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

Alo*_*ave 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].
    - 每个try块的处理程序[256].
    - 在单个函数声明上抛出规范[256].

  • 还有一个问题,鉴于上面的列表,其中一个问题定义了msvc 2010编译器抱怨的推荐的"部分"数量? (2认同)

Ale*_*kov 7

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

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