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

时间:2012-05-14 05:48:55

标签: c++ visual-c++ compiler-errors standards

我正在尝试使用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.Sprit)

2 个答案:

答案 0 :(得分:14)

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

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

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

附件B - 实施数量

  
      
  1. 由于计算机是有限的,C ++实现不可避免地受到限制   他们可以在程序的大小   成功处理。的每   实施应记录这些   已知的局限性。这个   文件可以引用固定限制   它们存在的地方,说如何计算   变量限制作为函数   可用资源,或者说固定   限制不存在或未知。

  2.   
  3. 限制可能会限制包含下述内容或数量的数量   其他。 以下括号内的数字   建议将每个数量作为   该数量的最小值。但是,   这些数量只是指导原则   并且不确定合规性。
    -   嵌套复合语句的级别,   迭代控制结构,和   选择控制结构[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]。

  4.   

答案 1 :(得分:7)

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

  

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