如何为 gsl:narrow 定义 __cpp_exceptions 进行编译?

How do I define __cpp_exceptions for gsl:narrow to compile?

我又糊涂了:(

我看过这个讨论:

我刚开始尝试使用 GSL。我已将 GSL 文件夹复制到我的 PC,并在我的 stdafx.h 文件中添加了 #include

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

我尝试在项目设置的预处理器列表中 #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 预览版编译 MFC C++ 项目。

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

您可以通过在“解决方案资源管理器”窗格中右键单击项目并select使用“属性”命令来check/change相关设置。

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

(注意:这适用于 Visual Studio 2019。我的电脑上没有安装 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;
}