如何定义 gsl:narrow 编译__cpp_exceptions?

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

提问人:Andrew Truckle 提问时间:10/3/2021 最后编辑:Adrian MoleAndrew Truckle 更新时间:10/3/2021 访问量:258

问:

我又感到困惑了:(

我看过这个讨论:

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

我是尝试使用 GSL 的新手。我已将 GSL 文件夹复制到我的 PC 并添加到我的文件中。#includestdafx.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 预览版编译 MFC C++ 项目。

C++ MFC CPP 核心指南 visual-studio-2022

评论


答:

2赞 Adrian Mole 10/3/2021 #1

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

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

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

enter image description here

(注意:这适用于 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;
}

评论

0赞 Andrew Truckle 10/3/2021
都很好。谢谢!