CARLA
 
载入中...
搜索中...
未找到
Debug.h
浏览该文件的文档.
1// Copyright (c) 2019 Computer Vision Center (CVC) at the Universitat Autonoma
2// de Barcelona (UAB).
3//
4// This work is licensed under the terms of the MIT license.
5// For a copy, see <https://opensource.org/licenses/MIT>.
6
7/// 用于断言和仅调试代码的宏实用程序。
8///
9/// 定义三个级别的断言:debug、development 和 release
10/// 由default,如果定义了 NDEBUG,则级别设置为 development,
11/// 否则设置为 debug。
12///
13/// 此处定义了以下宏:
14///
15/// * DEBUG_ONLY(code) - 只有当断言级别设置为调试时,才会对代码进行评估
16///
17/// * DEVELOPMENT_ONLY(code) - 仅当断言级别设置为development或更高时,才会评估代码。
18///
19/// * DEBUG_ASSERT(predicate) - 有效地调用 assert(谓词)。
20///
21/// * DEVELOPMENT_ASSERT(predicate) - 如果 assertion 设置为 development 或更高级别,则引发异常,并且 predicate 的计算结果为 false。
22///
23/// * RELEASE_ASSERT(predicate) -如果 predicate 的计算结果为 false,则引发异常。
24
25#pragma once
26
27#include "carla/Exception.h"
28
29#include <stdexcept>
30
31// 定义不同的断言级别
32#define LIBCARLA_ASSERT_LEVEL_DEBUG 30
33#define LIBCARLA_ASSERT_LEVEL_DEVELOPMENT 20
34#define LIBCARLA_ASSERT_LEVEL_RELEASE 10
35
36// 如果没有显式设置 LIBCARLA_ASSERT_LEVEL,则根据是否定义了 NDEBUG 来选择断言级别
37#ifndef LIBCARLA_ASSERT_LEVEL
38# ifdef NDEBUG
39# define LIBCARLA_ASSERT_LEVEL LIBCARLA_ASSERT_LEVEL_DEVELOPMENT
40# else
41# define LIBCARLA_ASSERT_LEVEL LIBCARLA_ASSERT_LEVEL_DEBUG
42# endif // NDEBUG
43#endif // LIBCARLA_ASSERT_LEVEL
44
45// 如果断言级别大于或等于调试级别,且没有定义 NDEBUG(不在发布模式),则启用断言
46#if (LIBCARLA_ASSERT_LEVEL >= LIBCARLA_ASSERT_LEVEL_DEBUG)
47# ifdef NDEBUG
48# error Cannot have debug asserts with NDEBUG enabled.
49# endif
50# include <cassert>
51#endif // NDEBUG
52
53// 如果断言级别大于或等于调试级别,定义 DEBUG_ONLY 宏:仅在调试模式下有效
54#if (LIBCARLA_ASSERT_LEVEL >= LIBCARLA_ASSERT_LEVEL_DEBUG)
55# define DEBUG_ONLY(code) code
56#else
57# define DEBUG_ONLY(code)
58#endif
59
60// 如果断言级别大于或等于开发级别,定义 DEVELOPMENT_ONLY 宏:仅在开发模式下有效
61#if (LIBCARLA_ASSERT_LEVEL >= LIBCARLA_ASSERT_LEVEL_DEVELOPMENT)
62# define DEVELOPMENT_ONLY(code) code
63#else
64# define DEVELOPMENT_ONLY(code)
65#endif
66
67// 定义用于调试断言的宏
68#define DEBUG_ASSERT(predicate) DEBUG_ONLY(assert(predicate));
69
70#define DEBUG_ERROR DEBUG_ASSERT(false);
71
72// 如果启用了 Google Test (LIBCARLA_WITH_GTEST),则使用 GTest 的断言功能
73#ifdef LIBCARLA_WITH_GTEST
74# include <gtest/gtest.h>
75
76// 通过 GTest 的 EXPECT_EQ 和 EXPECT_NE 定义调试断言
77# define DEBUG_ASSERT_EQ(lhs, rhs) DEBUG_ONLY(EXPECT_EQ(lhs, rhs));DEBUG_ASSERT(lhs == rhs);
78# define DEBUG_ASSERT_NE(lhs, rhs) DEBUG_ONLY(EXPECT_NE(lhs, rhs));DEBUG_ASSERT(lhs != rhs);
79#else
80// 如果没有启用 GTest,使用标准的调试断言来检查等于和不等于
81# define DEBUG_ASSERT_EQ(lhs, rhs) DEBUG_ASSERT((lhs) == (rhs))
82# define DEBUG_ASSERT_NE(lhs, rhs) DEBUG_ASSERT((lhs) != (rhs))
83#endif // LIBCARLA_WITH_GTEST
84
85#define LIBCARLA_ASSERT_THROW__(pred, msg) if (!(pred)) { ::carla::throw_exception(std::runtime_error(msg)); }
86// LIBCARLA_ASSERT_THROW__ 是一个宏,用于在断言失败时抛出异常
87// 它接受两个参数:pred(一个布尔表达式)和 msg(一个错误消息字符串)
88// 如果 pred 为 false(即断言失败),则调用 ::carla::throw_exception 函数抛出一个 std::runtime_error 异常,异常信息为 msg
89#define DEVELOPMENT_ASSERT(pred) DEVELOPMENT_ONLY(LIBCARLA_ASSERT_THROW__(pred, #pred))
90// DEVELOPMENT_ASSERT 是一个宏,用于在开发阶段进行断言检查
91// 它接受一个参数:pred(一个布尔表达式)
92// 在开发版本中,它使用 DEVELOPMENT_ONLY 宏来包含 LIBCARLA_ASSERT_THROW__ 宏的调用
93// 而在发布版本中,DEVELOPMENT_ONLY 宏可能定义为空,因此 DEVELOPMENT_ASSERT 不会有任何效果
94#define RELEASE_ASSERT(pred) LIBCARLA_ASSERT_THROW__(pred, #pred)
95// RELEASE_ASSERT 是一个宏,用于在发布版本中进行断言检查
96// 它与 DEVELOPMENT_ASSERT 类似,但不受 DEVELOPMENT_ONLY 宏的影响
97// 因此,在发布版本中,RELEASE_ASSERT 仍然会进行断言检查,并在断言失败时抛出异常
98// 注意事项:
99// 1. #pred 是一个预处理操作符,用于将 pred 表达式转换为字符串字面量
100// 这样,当断言失败时,抛出的异常信息将包含导致失败的表达式文本
101// 2. ::carla::throw_exception 可能是一个在 carla 命名空间中定义的函数,用于统一处理异常抛出
102// 这个函数可能包含了一些额外的日志记录或错误处理逻辑
103// 3. DEVELOPMENT_ONLY 是一个宏,其定义取决于编译时的配置(例如,通过预处理器定义)
104// 在开发版本中,它可能定义为 #define DEVELOPMENT_ONLY(x) x
105// 而在发布版本中,它可能定义为 #define DEVELOPMENT_ONLY(x) /* 空操作 */ 或类似的东西
106// 4. 使用这些宏时,请确保您的项目中已经定义了 carla 命名空间和 ::carla::throw_exception 函数
107// 否则,编译时将出现错误