尝试升级/编译旧的C++源(来自供应商) - “std::runtime_error”问题

Trying to upgrade / compile old C++ source (from a vendor) - problem with "std::runtime_error"

提问人:mnemotronic 提问时间:11/5/2023 最后编辑:mnemotronic 更新时间:11/6/2023 访问量:106

问:

我正在尝试从我们使用的产品中编译一些示例代码。我不认为供应商维护了代码。我正在使用 VS Pro 2022 版本 17.7.5 下面是代码的截图及其生成的错误。我已经 15 年没有使用 C++ 或 Visual Studio 了。我记得,一切都更加复杂和晦涩。 我正在尝试解决第 #17 行的“runtime_error”问题。我无法理解这方面的文档。我试过通过在第 17 行的东西周围放 parens 来霰弹枪,但无济于事。

/* ReadDynaRecordListWithWhere.cpp : Defines the entry point for the console application.
    The purpose of this example is to show how to define a dynamic query and read only
    requested column data from the TeamTrack database. This example shows how to request
    information about the users who are members of the "Everyone" group in TeamTrack.
*/

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

// Create these before we start because when a memory allocation
// fails it will bee too late (no memory to create new stuff).
static const char * memoryMessage = "Memory allocation failed.";
#ifdef WIN32
static const std::runtime_error bad_alloc( memoryMessage );  // *** Line #17

// Define a function to be called if new fails to allocate memory.
int TSNewHandler( size_t size )
{
  printf( "Throwing: %s\n", memoryMessage );
  throw bad_alloc;                                           // *** Line #23
  return NULL;
}
#endif

错误列表:

Severity  Code   Description                                                                    Line
Error     C2039  'runtime_error': is not a member of 'std'                                      17    
Message          see declaration of 'std'                                                       25    
Error     C4430  missing type specifier - int assumed. Note: C++ does not support default-int   17    
Error     C2146  syntax error: missing ';' before identifier 'bad_alloc'                        17    
Error     C4430  missing type specifier - int assumed. Note: C++ does not support default-int   17    
Error     C2040  'memoryMessage': 'int' differs in levels of indirection from 'const char *'    17    
Error     C2065  'bad_alloc': undeclared identifier                                             23    
C++ 标准 visual-studio-2022

评论

3赞 Pete Becker 11/5/2023
代码不包含正确的标头。有时你可以侥幸逃脱;其他时候你不能。旁白:高度可疑。它不是标准标头。它很可能是预标准代码,在这种情况下,您还有很多工作要做。<new.h>
1赞 Pepijn Kramer 11/5/2023
看起来缺少包含:。#include <stdexcept>
3赞 Jarod42 11/5/2023
修复 ... ->#include<stdexcept>
2赞 Marek R 11/5/2023
en.cppreference.com/w/cpp/memory/new/bad_alloc en.cppreference.com/w/cpp/error/runtime_error 如此恰当的包括是:和。这是错误的:它应该是或自 C++11 以来。注意缺少 。#include <new>#include <stdexcept>throw bad_alloc;throw std::bad_alloc();throw std::bad_alloc{};std::
2赞 Swift - Friday Pie 11/5/2023
拥有失败的新处理程序的整个想法是标准的,听起来像是麻烦......代码中 new.h 的存在可能表明代码库实际上不适合现代编译器,而无需仔细重构。尽管 modern new 包含 no-throw 重载,但它的行为有所不同 - 如果可以,则返回 null。bad_alloc可能会受到命名空间污染 - 已经有 .std::bad_alloc

答:

-1赞 mnemotronic 11/6/2023 #1

编辑 2023-11-05

我按照@PeteBecker、@PepijnKramer和@Jarod42添加了“”。这消除了错误。非常感谢响应者!#include <stdexcept>

尽管“新”似乎没有引起问题,但我还是按照@MarekR概述进行了更改。这些变化没有引起任何新的问题,因此它们将继续存在。

我(仍然)收到很多关于“警告MSB8012”的警告,但会在 StackO 的其他地方尝试这些建议。

评论

0赞 pmacfarlane 11/7/2023
请使用问题中的编辑链接添加其他信息。“发布答案”按钮应仅用于完整回答问题。- 从评论