You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VS2022编译旧C++代码时std::runtime_error相关报错求助

编译旧C++示例代码遇到std::runtime_error相关错误

我用VS Pro 2022 17.7.5版本编译厂商提供的未维护示例代码,已经15年没碰C++和Visual Studio了,现在对编译问题一头雾水。尝试修复第17行的std::runtime_error相关问题,但看不懂官方文档,改代码也没用。

相关代码片段

/* ReadDynaRecordListWithWhere.cpp : 定义控制台应用程序的入口点。
    本示例旨在展示如何定义动态查询,仅从TeamTrack数据库读取所需列的数据。示例演示了如何获取TeamTrack中"Everyone"组成员的用户信息。
*/

#include "stdafx.h"
#include <stdio.h>
#include <new.h>
#include "TSServer.h"
#include "TSDynaRecordList.h"

// 在程序启动前创建这些对象,因为内存分配失败时再创建就太晚了(没有内存来新建对象)。
static const char * memoryMessage = "内存分配失败。";
#ifdef WIN32
static const std::runtime_error bad_alloc( memoryMessage );  // *** 第17行

// 定义new分配内存失败时调用的函数。
int TSNewHandler( size_t size )
{
  printf( "抛出错误: %s\n", memoryMessage );
  throw bad_alloc;                                           // *** 第23行
  return NULL;
}
#endif

编译报错信息

级别    代码   描述                                                                 行号
错误     C2039  'runtime_error': 不是'std'的成员                                      17    
消息          参见'std'的声明                                                       25    
错误     C4430  缺少类型说明符 - 假定为int。注意: C++不支持默认int类型                  17    
错误     C2146  语法错误: 标识符'bad_alloc'前缺少';'                                17    
错误     C4430  缺少类型说明符 - 假定为int。注意: C++不支持默认int类型                  17    
错误     C2040  'memoryMessage': 'int'与'const char *'的间接级别不同                    17    
错误     C2065  'bad_alloc': 未声明的标识符                                           23    

修复方案

  • 核心问题:代码使用std::runtime_error但未包含对应的标准头文件,VS2022严格遵循C++标准,必须显式引入头文件才能使用标准库中的异常类型。
  • 具体修复步骤:
    1. 在代码的包含头文件区域添加#include <stdexcept>,这个头文件是std::runtime_error的定义所在。
    2. (可选,更规范)标准库中已有std::bad_alloc异常类型(定义在<new>头文件中),无需自行创建同名的std::runtime_error对象,直接抛出标准异常即可,修改后的代码如下:
      #include "stdafx.h"
      #include <stdio.h>
      #include <new.h>
      #include <stdexcept>  // 新增的必要头文件
      #include "TSServer.h"
      #include "TSDynaRecordList.h"
      
      static const char * memoryMessage = "内存分配失败。";
      #ifdef WIN32
      int TSNewHandler( size_t size )
      {
        printf( "抛出错误: %s\n", memoryMessage );
        throw std::bad_alloc();  // 直接抛出标准内存分配失败异常
        return NULL;
      }
      #endif
      
    3. 确认项目C语言标准:右键项目→属性→C/C→语言,选择与旧代码兼容的标准(如C++17或更低版本)。

内容的提问来源于stack exchange,提问作者mnemotronic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 22:24:50