0

我又开始困惑了:(

我看过这个讨论:

在编译时检测异常是否被禁用

我是尝试使用 GSL 的新手。我已将 GSL 文件夹复制到我的 PC 并添加#include到我的stdafx.h文件中。

但是gsl:narrow命令没有暴露。然后我看到它指的是__cpp_exceptions宏/令牌。

我在项目设置的预处理器列表中尝试了#define它,但它不喜欢它。

我该如何激活它__cpp_exceptions

gsl 头文件:

#ifndef GSL_GSL_H
#define GSL_GSL_H

#include <gsl/algorithm>   // copy
#include <gsl/assert>      // Ensures/Expects
#include <gsl/byte>        // byte
#include <gsl/pointers>    // owner, not_null
#include <gsl/span>        // span
#include <gsl/string_span> // zstring, string_span, zstring_builder...
#include <gsl/util>        // finally()/narrow_cast()...

#ifdef __cpp_exceptions
#include <gsl/narrow> // narrow()
#endif

#endif // GSL_GSL_H

我正在尝试使用 Visual Studio 2022 Preview 编译 MFC C++ 项目。

4

1 回答 1

2

宏是否__cpp_exceptions由 MSVC 编译器预定义取决于 Visual Studio 项目的设置(即是否启用 C++ 异常)。

您可以通过右键单击解决方案资源管理器窗格中的项目并选择“属性”命令来检查/更改相关设置。

在出现的弹窗中,打开左侧导航树中的“C/C++”节点,选择“代码生成”子节点。然后,在右侧窗格中,确保“启用 C++ 异常”选项设置为“是 (/EHsc) ”(其他种类的“是”选项也可以工作):

在此处输入图像描述

(注意:这适用于 Visual Studio 2019。我的 PC 上没有安装 V/S 2022,所以我无法在该版本中检查它——但我想这个过程非常相似。)

以下简短的控制台模式程序演示了更改该设置引起的差异:

#include <iostream>
int main()
{
    #ifdef __cpp_exceptions
    std::cout << "yes";    // With "Yes (/EHsc)"
    #else
    std::cout << "no";     // With "No"
    #endif
    std::cout << std::endl;
    return 0;
}
于 2021-10-03T13:56:11.257 回答