YSTest: ydef.h 文件参考

YSTest PreAlpha_b900_20201012 The YSLib Test Project

类 | 命名空间 | 宏定义 | 类型定义 | 函数 | 变量
ydef.h 文件参考
YBaseLib

语言实现和系统环境相关特性及公用类型和宏的基础定义。 更多...

`#include <cstddef>`
`#include <cstdlib>`
`#include <climits>`
`#include <cstdint>`
`#include <cassert>`
`#include <cwchar>`
`#include <utility>`
`#include <type_traits>`
ydef.h 的引用(Include)关系图:
此图展示该文件直接或间接的被哪些文件引用了:

浏览源代码.

## 类

class | ystdex::nullptr_t
| 空指针类。 更多...
struct | ystdex::empty_base<... >
| 空基类模板。 更多...
struct | ystdex::raw_tag
| 直接构造类型（直接构造重载用）。 更多...
class | ystdex::offsetof_check< _bMemObjPtr, _bNoExcept, _type >
| 成员偏移计算静态类型检查。 更多...

## 命名空间

| ystdex
| `<memory>` 特性测试宏。

## 宏定义

#define | __has_attribute(...) 0
| 特性检测宏补充定义：若不可用则替换为预处理记号 0 。 更多...
#define | __has_builtin(...) 0
#define | __has_cpp_attribute(...) 0
#define | __has_extension(...) 0
#define | __has_feature(...) 0
#define | __has_include(...) 0
#define | YPP_Args(...) __VA_ARGS__
| 替换列表。 更多...
#define | YPP_Empty
| 替换为空的预处理记号。 更多...
#define | YPP_Comma ,
| 替换为逗号的预处理记号。 更多...
#define | YPP_Concat(_x, _y) _x ## _y
| 记号连接。 更多...
#define | YPP_Join(_x, _y) YPP_Concat(_x, _y)
| 带宏替换的记号连接。 更多...
#define | YPP_Stringify(_x) #_x
| 替换预处理记号为字符串。 更多...
#define | YPP_Stringize(_x) YPP_Stringify(_x)
| 替换被宏替换的预处理记号为字符串。 更多...
#define | yimpl(...) __VA_ARGS__
| 实现标签。 更多...
#define | YB_Diag_Push
#define | YB_Diag_Pop
#define | YB_Diag_Ignore
#define | YB_HAS_ALIGNAS
| 内建 alignas 支持。 更多...
#define | YB_HAS_ALIGNOF
| 内建 alignof 支持。 更多...
#define | YB_HAS_BUILTIN_NULLPTR
| 内建 nullptr 支持。 更多...
#define | YB_HAS_NOEXCEPT
#define | YB_HAS_THREAD_LOCAL
| thread_local 支持。 更多...
#define | YB_ABORT std::abort()
| 非正常终止程序。 更多...
#define | YB_ATTR(...)
| GNU 风格属性。 更多...
#define | YB_ATTR_LAMBDA(...) YB_ATTR(__VA_ARGS__)
| 允许在 lambda 表达式的参数列表后使用的属性。 更多...
#define | YB_ATTR_LAMBDA_QUAL(_q, ...) _q __VA_ARGS__
| 允许在 lambda 表达式的参数列表后和限定符共用的属性。 更多...
#define | YB_ATTR_STD(...)
| C++ 标准属性。 更多...
#define | YB_ATTR_fallthrough
| 用于 switch 语句的 fallthrough 属性。 更多...
#define | YB_ATTR_gnu_printf(...)
| GNU 风格 printf 属性。 更多...
#define | YB_ATTR_maybe_unused
| 标记可被忽略的属性。 更多...
#define | YB_ATTR_nodiscard
| 标记返回值不被忽略的属性。 更多...
#define | YB_ATTR_novtable
| 修饰类定义要求实现不生成初始化动态类型信息。 更多...
#define | YB_ATTR_returns_nonnull
| 指示返回非空属性。 更多...
#define | YB_ALLOCATOR YB_ATTR_nodiscard
| 指示返回指针的函数或函数模板若为非空值则对应的存储不和其它对象指针共享别名。 更多...
#define | YB_ASSUME(_expr) ((_expr) ? void() : YB_ABORT)
| 假定表达式的求值总是为真。 更多...
#define | YB_EXPECT(_expr, _constant) (_expr)
#define | YB_LIKELY(_expr) (_expr)
#define | YB_UNLIKELY(_expr) (_expr)
| 分支预测提示。 更多...
#define | YB_FLATTEN
| 标记函数尽可能内联定义内的调用。 更多...
#define | YB_NORETURN
| 指定无返回值函数。 更多...
#define | YB_PURE
| 指示函数或函数模板实例为纯函数。 更多...
#define | YB_STATELESS
| 指示函数或函数模板实例为无状态函数。 更多...
#define | YB_API
| YBase 应用程序编程接口：用于向库文件约定链接。 更多...
#define | YB_Use_YAssert 1
| 使用断言。 更多...
#define | YB_Use_YTrace 1
| 使用调试跟踪记录。 更多...
#define | yalignas(_expr) YB_ATTR(__aligned__(_expr))
| 指定特定类型的对齐。 更多...
#define | yalignas_type(_type) YB_ATTR(__aligned__(__alignof(_type)))
#define | yalignof(_type) std::alignment_of<_type>::value
| 指定特定类型的对齐。 更多...
#define | yconstexpr
| 指定编译时常量表达式。 更多...
#define | yconstfn inline
| 指定编译时常量函数。 更多...
#define | yconstexpr_inline yconstexpr
| 可选的内联 constexpr 变量。 更多...
#define | yconstfn_relaxed inline
| 指定编译时没有 C++11 限制和隐式成员 const 的常量函数。 更多...
#define | yfname "<unknown-fn>"
| 展开为表示函数名的预定义变量的宏。 更多...
#define | yfsig "<unknown-fsig>"
| 展开为表示函数签名的预定义变量的宏。 更多...
#define | ynoexcept(...)
| YSLib 无异常抛出保证：指定特定的异常规范。 更多...
#define | ynoexcept_assert(_msg, ...)
| 表达式 `noexcept` 静态断言。 更多...
#define | ynoexcept_param(_n)
| 影响函数类型的 noexcept 限定符参数。 更多...
#define | ynoexcept_qual(...)
| 影响函数类型的 noexcept 限定符表达式。 更多...
#define | ynoexcept_spec(...) ynoexcept(noexcept(__VA_ARGS__))
| 表达式 `noexcept` 异常规范。 更多...
#define | ynothrow ythrow()
| YSLib 无异常抛出保证：若支持 noexcept 关键字， 指定特定的 noexcept 异常规范。 更多...
#define | ynothrowv
| YSLib 无异常抛出保证验证：有条件地使用无异常抛出规范。 更多...
#define | ythread
| 线程局部存储：若实现支持，指定为 `thread_local` 。 更多...
#define | ythrow(...)
| YSLib 动态异常规范：根据是否使用异常规范宏指定或忽略动态异常规范。 更多...
#define | yunused(...) static_cast<void>(__VA_ARGS__)
| 标记未使用的表达式。 更多...
#define | yoffsetof(_type, _member)
| 带有静态类型检查的成员偏移计算。 更多...
#define | yforward(_expr) std::forward<decltype(_expr)>(_expr)
| 根据参数类型使用 std::forward 转发对应参数。 更多...
#define | yunseq ystdex::unsequenced
| 无序列依赖表达式组求值。 更多...

## 类型定义

using | ystdex::byte = unsigned char
| 字节类型。 更多...
using | ystdex::octet = void

## 函数

template<typename _type , typename... _tParams>
auto | ystdex::unsequenced (_type &&arg, _tParams &&...) -> decltype(std::forward< decltype(arg)>(arg))
| 无序列依赖表达式组求值实现。 更多...

## 变量

const class ystdex::nullptr_t | ystdex::nullptr = {}

## 详细描述

语言实现和系统环境相关特性及公用类型和宏的基础定义。

版本
  r3859

作者
  FrankHB frank.nosp@m.hb19.nosp@m.89@gm.nosp@m.ail..nosp@m.com

自从
  早于 build 132

创建时间:
  2009-12-02 21:42:44 +0800

修改时间:
  2020-03-16 10:16 +0800

文本编码:
  UTF-8

模块名称:
  YDefinition

在文件 ydef.h 中定义.

## 宏定义说明

## ◆ __has_attribute

#define __has_attribute | ( |  | ... | ) | 0

特性检测宏补充定义：若不可用则替换为预处理记号 0 。

自从
  build 484

参见
  http://clang.llvm.org/docs/LanguageExtensions.html#has-attribute 。

自从
  build 628

在文件 ydef.h 第 140 行定义.

## ◆ __has_builtin

#define __has_builtin | ( |  | ... | ) | 0

参见
  http://clang.llvm.org/docs/LanguageExtensions.html#has-builtin 。
  https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66970 。

自从
  build 535

在文件 ydef.h 第 149 行定义.

## ◆ __has_cpp_attribute

#define __has_cpp_attribute | ( |  | ... | ) | 0

参见
  http://clang.llvm.org/docs/LanguageExtensions.html#has-cpp-attribute 。

自从
  build 591

在文件 ydef.h 第 157 行定义.

## ◆ __has_extension

#define __has_extension | ( |  | ... | ) | 0

参见
  http://clang.llvm.org/docs/LanguageExtensions.html#has-feature-and-has-extension 。

在文件 ydef.h 第 163 行定义.

## ◆ __has_feature

#define __has_feature | ( |  | ... | ) | 0

在文件 ydef.h 第 167 行定义.

## ◆ __has_include

#define __has_include | ( |  | ... | ) | 0

参见
  http://clang.llvm.org/docs/LanguageExtensions.html#has-include 。

自从
  build 831

在文件 ydef.h 第 176 行定义.

## ◆ yalignas

#define yalignas | ( |  | _expr | ) | YB_ATTR(__aligned__(_expr))

指定特定类型的对齐。

注解
  同 C++11 alignas 作用于类型时的语义。

自从
  build 591

待办事项:
  判断没有内建关键字支持时属性存在及没有属性支持时的其它情况。

在文件 ydef.h 第 1041 行定义.

## ◆ yalignas_type

#define yalignas_type | ( |  | _type | ) | YB_ATTR(__aligned__(__alignof(_type)))

在文件 ydef.h 第 1042 行定义.

## ◆ yalignof

#define yalignof | ( |  | _type | ) | std::alignment_of<_type>::value

指定特定类型的对齐。

注解
  同 C++11 alignof 作用于类型时的语义。

自从
  build 315

在文件 ydef.h 第 1054 行定义.

## ◆ YB_ABORT

#define YB_ABORT std::abort()

非正常终止程序。

注解
  可能使用体系结构相关实现或标准库 std::abort 函数等。

自从
  build 535

在文件 ydef.h 第 541 行定义.

## ◆ YB_ALLOCATOR

#define YB_ALLOCATOR YB_ATTR_nodiscard

指示返回指针的函数或函数模板若为非空值则对应的存储不和其它对象指针共享别名。

注解
  指示行为类似 std::malloc 或 std::calloc 等的函数。

警告
  要求满足指示的假定，否则行为未定义。

参见
  https://docs.microsoft.com/cpp/cpp/restrict?view=vs-2017 。
  https://blogs.msdn.microsoft.com/vcblog/2015/10/21/memory-profiling-in-visual-c-2015/ 。
  https://blogs.msdn.microsoft.com/vcblog/2016/05/25/tracking-custom-memory-allocations-with-visual-studio-15-preview-2/ 。
  https://gitlab.gnome.org/GNOME/glib/issues/1465 。

自从
  build 373

指示函数若返回非空指针，返回的指针指向的存储中的指针不是其它任何有效对象指针的别名， 且指针指向的存储内容不由其它存储决定。

在文件 ydef.h 第 786 行定义.

## ◆ YB_API

#define YB_API

YBase 应用程序编程接口：用于向库文件约定链接。

自从
  build 362

待办事项:
  判断语言特性支持。

在文件 ydef.h 第 986 行定义.

## ◆ YB_ASSUME

#define YB_ASSUME | ( |  | _expr | ) | ((_expr) ? void() : YB_ABORT)

假定表达式的求值总是为真。

注解
  未指定表达式是否被求值。
  可作为优化提示。可能影响控制流预测，一般接近对应条件被求值的位置局部使用。
  一般应避免表达式求值的副作用。预期的求值性质和被 YB_PURE 的函数调用相同。

警告
  若假定不成立则行为未定义。

参见
  https://clang.llvm.org/docs/LanguageExtensions.html#builtin-assume 。
  https://reviews.llvm.org/rL217349 。
  https://bugs.llvm.org/show_bug.cgi?id=32424 。

自从
  build 535

在文件 ydef.h 第 812 行定义.

## ◆ YB_ATTR

#define YB_ATTR | ( |  | ... | ) |

GNU 风格属性。

警告
  不检查指令。用户应验证可能使用的指令中的标识符在宏替换后能保持正确。

自从
  build 373

在文件 ydef.h 第 568 行定义.

## ◆ YB_ATTR_fallthrough

#define YB_ATTR_fallthrough

用于 switch 语句的 fallthrough 属性。

自从
  build 793

参见
  WG21 P0188R1 。

在文件 ydef.h 第 656 行定义.

## ◆ YB_ATTR_gnu_printf

#define YB_ATTR_gnu_printf | ( |  | ... | ) |

GNU 风格 printf 属性。

注解
  早期版本 Clang++ 未支持此属性，警告 [-Wignored-attributes] 。

自从
  build 615

参见
  https://clang.llvm.org/docs/AttributeReference.html#format 。

在文件 ydef.h 第 672 行定义.

## ◆ YB_ATTR_LAMBDA

#define YB_ATTR_LAMBDA | ( |  | ... | ) | YB_ATTR(__VA_ARGS__)

允许在 lambda 表达式的参数列表后使用的属性。

参见
  YB_ATTR_LAMBDA_QUAL
  https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89640 。

自从
  build 860

选择性启用 lambda 表达式的扩展属性。 参见以下 YB_ATTR_LAMBDA_QUAL 的使用。

在文件 ydef.h 第 582 行定义.

## ◆ YB_ATTR_LAMBDA_QUAL

#define YB_ATTR_LAMBDA_QUAL | ( |  | _q,
|  |  | ...
| ) |  | _q __VA_ARGS__

允许在 lambda 表达式的参数列表后和限定符共用的属性。

参见
  https://gcc.gnu.org/bugzilla/show_bug.cgi?id=60503 。

自从
  build 864

在 lambda 表达式中可能同时支持标准属性、限定符和（不修饰返回类型的）扩展属性。 语法示例： `[]() attribute(()) noexcept [[]] -> void{}` 。 配合其它宏的语法示例： `[]() YB_ATTR() ynothrow YB_ATTR_STD() -> void{}` 。 Clang++ 9 正确支持这些属性，而 G++ 9 之前不支持，需要调换标准属性和限定符的顺序。 G++ 9 之前可支持： `[]() YB_ATTR() ynothrow -> void{}` ； `[]() YB_ATTR_STD() ynothrow -> void{}` 。 G++ 9.1 起可支持： `[]() ynothrow YB_ATTR_STD() YB_ATTR(){}` ； `[]() ynothrow YB_ATTR_STD() -> void{}` 。 显式返回类型在此和 YB_ATTR() 冲突而不能同时使用。 作为变通，正确的 YB_ATTR 使用 YB_ATTR_LAMBDA 代替，此时，语法如以下之一： `[]() YB_ATTR_LAMBDA_QUAL(ynothrow, YB_ATTR_LAMBDA()) -> void{}` ； `[]() YB_ATTR_LAMBDA_QUAL(ynothrow, YB_ATTR_STD()) -> void{}` ； `[]() YB_ATTR_LAMBDA_QUAL(ynothrow, YB_ATTR()){}` ； `[]() YB_ATTR_LAMBDA_QUAL(ynothrow, YB_ATTR_STD()){}` ； `[]() YB_ATTR_LAMBDA() -> void{}` ； `[]() YB_ATTR_STD() -> void{}` ； `[]() YB_ATTR(){}` ； `[]() YB_ATTR_STD(){}` 。 G++ 9.1 起，YB_ATTR_LAMBDA 中的 attribute 暂不起效。 注意，Clang++ 不支持标准属性 [[noreturn]] 修饰 lambda 表达式， 这类属性不能选择 YB_ATTR_STD 。

在文件 ydef.h 第 620 行定义.

## ◆ YB_ATTR_maybe_unused

#define YB_ATTR_maybe_unused

标记可被忽略的属性。

自从
  build 833

参见
  WG21 P0212R1 。
  https://clang.llvm.org/docs/AttributeReference.html#maybe-unused-unused-gnu-unused 。
  https://gcc.gnu.org/projects/cxx-status.html 。

在文件 ydef.h 第 690 行定义.

## ◆ YB_ATTR_nodiscard

#define YB_ATTR_nodiscard

标记返回值不被忽略的属性。

自从
  build 833

参见
  WG21 P0189R1 。
  https://clang.llvm.org/docs/AttributeReference.html#nodiscard-warn-unused-result 。
  https://gcc.gnu.org/projects/cxx-status.html 。
  https://docs.microsoft.com/cpp/code-quality/annotating-function-behavior 。

在文件 ydef.h 第 716 行定义.

## ◆ YB_ATTR_novtable

#define YB_ATTR_novtable

修饰类定义要求实现不生成初始化动态类型信息。

注解
  只适用于定义不在初始化派生类对象时的动态类型的类，否则行为未定义。

参见
  https://docs.microsoft.com/cpp/cpp/novtable 。
  http://releases.llvm.org/3.7.0/tools/clang/docs/AttributeReference.html 。
  https://clang.llvm.org/docs/AttributeReference.html#novtable 。
  http://lists.llvm.org/pipermail/cfe-commits/Week-of-Mon-20150720/133747.html 。

自从
  build 842

待办事项:
  确认可忽略不支持情形的 Clang++ 最近可用的版本。

修饰类定义，允许实现省略若干在初始化类的对象时的隐含初始化。 这些初始化通常用于保证派生类的动态类型正确实现 ISO C++ 调用基类虚函数的语义。 只适用于定义不在初始化对象时调用基类虚函数和使用 RTTI （作为操作数使用 dynamic_cast 或 typeid ）的类，否则行为未定义。 一般用于只有纯虚函数（除析构函数是非纯的虚函数）的基类。 派生类的构造函数使用这些依赖其动态类型的操作已引起未定义行为， 参见 ISO C++ [abstract.class]/6 ； 因此当基类只有纯虚函数时，不改变程序的预期语义，而仅用于优化。 其它情形派生类需要排除更多的限制。 当前 Microsoft VC++ 或 Clang++（使用 Microsoft ABI ）支持这项特性。 对不支持的情形，近期版本 Clang++ 可直接忽略。

在文件 ydef.h 第 746 行定义.

## ◆ YB_ATTR_returns_nonnull

#define YB_ATTR_returns_nonnull

指示返回非空属性。

自从
  build 676

参见
  https://clang.llvm.org/docs/AttributeReference.html#returns-nonnull 。
  http://reviews.llvm.org/rL199626 。
  http://reviews.llvm.org/rL199790 。

待办事项:
  确认 Clang++ 最低可用的版本。

在文件 ydef.h 第 762 行定义.

## ◆ YB_ATTR_STD

#define YB_ATTR_STD | ( |  | ... | ) |

C++ 标准属性。

注解
  注意和 GNU 风格不同，在使用时受限，如不能修饰 lambda 表达式非类型的声明。

警告
  不检查指令。用户应验证可能使用的指令中的标识符在宏替换后能保持正确。

自从
  build 605

在文件 ydef.h 第 636 行定义.

## ◆ YB_Diag_Ignore

#define YB_Diag_Ignore

在文件 ydef.h 第 444 行定义.

## ◆ YB_Diag_Pop

#define YB_Diag_Pop

在文件 ydef.h 第 443 行定义.

## ◆ YB_Diag_Push

#define YB_Diag_Push

在文件 ydef.h 第 442 行定义.

## ◆ YB_EXPECT

#define YB_EXPECT | ( |  | _expr,
|  |  | _constant
| ) |  | (_expr)

在文件 ydef.h 第 827 行定义.

## ◆ YB_FLATTEN

#define YB_FLATTEN

标记函数尽可能内联定义内的调用。

参见
  https://gcc.gnu.org/bugzilla/show_bug.cgi?id=48731 。
  https://bugs.llvm.org/show_bug.cgi?id=7559 。
  https://reviews.llvm.org/rL209217 。

自从
  build 646

在文件 ydef.h 第 844 行定义.

## ◆ YB_HAS_ALIGNAS

#define YB_HAS_ALIGNAS

值:
(__has_feature(cxx_alignas) \
|| __has_extension(cxx_alignas) || __cplusplus >= 201103L \
|| YB_IMPL_GNUCPP >= 40800 || YB_IMPL_MSCPP >= 1800)

内建 alignas 支持。

自从
  build 389

在文件 ydef.h 第 478 行定义.

## ◆ YB_HAS_ALIGNOF

#define YB_HAS_ALIGNOF

值:
(__has_feature(cxx_alignof) \
|| __has_extension(cxx_alignof) || __cplusplus >= 201103L \
|| YB_IMPL_GNUCPP >= 40500 || YB_IMPL_MSCPP >= 1800)

内建 alignof 支持。

参见
  https://blogs.msdn.microsoft.com/vcblog/2015/06/19/c111417-features-in-vs-2015-rtm/ 。

自从
  build 315

在文件 ydef.h 第 489 行定义.

## ◆ YB_HAS_BUILTIN_NULLPTR

#define YB_HAS_BUILTIN_NULLPTR

值:
(__has_feature(cxx_nullptr) || __has_extension(cxx_nullptr) \
|| __cplusplus >= 201103L || YB_IMPL_GNUCPP >= 40600 || \
YB_IMPL_MSCPP >= 1600)

内建 nullptr 支持。

自从
  build 313

在文件 ydef.h 第 499 行定义.

## ◆ YB_HAS_NOEXCEPT

#define YB_HAS_NOEXCEPT

值:
(__has_feature(cxx_noexcept) || __has_extension(cxx_noexcept) || \
__cplusplus >= 201103L || YB_IMPL_GNUCPP >= 40600 \
|| YB_IMPL_MSCPP >= 1900)

在文件 ydef.h 第 510 行定义.

## ◆ YB_HAS_THREAD_LOCAL

#define YB_HAS_THREAD_LOCAL

值:
(__has_feature(cxx_thread_local) || (__cplusplus >= 201103L \
&& (!YB_IMPL_GNUCPP || _GLIBCXX_HAVE_TLS)) || YB_IMPL_MSCPP >= 1900)

thread_local 支持。

参见
  https://docs.microsoft.com/cpp/overview/visual-cpp-language-conformance 。
  https://gcc.gnu.org/projects/cxx-status.html 。

自从
  build 425

在文件 ydef.h 第 526 行定义.

## ◆ YB_LIKELY

#define YB_LIKELY | ( |  | _expr | ) | (_expr)

在文件 ydef.h 第 828 行定义.

## ◆ YB_NORETURN

#define YB_NORETURN

指定无返回值函数。

注解
  不保证适用修饰 lambda 。这种情况可使用 YB_ATTR_LAMBDA(noreturn) 代替。

警告
  当指定的函数调用实际返回时行为未定义。

参见
  YB_ATTR
  YB_ATTR_LAMBDA
  https://msdn.microsoft.com/en-us/library/hh567368.aspx 。

自从
  build 396

在文件 ydef.h 第 878 行定义.

## ◆ YB_PURE

#define YB_PURE

指示函数或函数模板实例为纯函数。

后置条件
  函数外可访问的存储保持不变。

警告
  用户应保证省略假定的等价副作用不影响程序的可观察行为，否则行为未定义。
  不同翻译单元内的函数应具有相同的指示，否则行为未定义。

注解
  假定函数保证至少有一条路径可返回；返回类型 void 时无意义。
  假定函数无外部可见的副作用：局部记忆化合并重复调用后不改变可观察行为。
  假定以外的等价的副作用可能按 as-if 规则被省略；指示可影响未指定的语义等价性。
  被忽略的副作用可能是控制副作用，如依赖 C++ 语义下外部不可见状态的异常抛出。
  无视 virtual 关键字，但修饰基类函数时也表示对覆盖版本的要求。
  当前对 virtual 关键字的行为不是实现公开的接口，由分析具体实现保证。

参见
  WG21 P0078R0 。

自从
  build 373

参见
  https://reviews.llvm.org/rL230763 。
  https://bugs.llvm.org/show_bug.cgi?id=43275 。

指示函数或函数模板的求值仅用于计算返回值，无影响其它顶层块作用域外存储的副作用， 且返回值只依赖参数和/或编译时确定内存位置（如静态存储的对象的）存储的值。 假定条件包括： 不修改函数外部的存储； 不访问函数外部 volatile 存储； 不调用具有不可忽略副作用而不可被 YB_PURE 安全指定的函数。

在文件 ydef.h 第 920 行定义.

## ◆ YB_STATELESS

#define YB_STATELESS

指示函数或函数模板实例为无状态函数。

前置条件
  若参数是对象指针或引用类型，应保证指向或引用的对象是其它参数，或者不被使用。

自从
  build 373

指示函数或函数模板的求值仅用于计算返回值，无影响其它顶层块作用域外存储的副作用， 假定函数调用的结果总是相同：返回值总是不可分辨的右值或指示同一个内存位置的左值。 任意以一次调用结果替代调用或合并重复调用时不改变可观察行为。 且返回值只依赖参数的值，和其它存储无关。 假定条件包括： 不访问函数外部的存储； 不调用具有不可忽略副作用而不可被 YB_STATELESS 安全指定的函数。 可被安全指定的函数或函数模板是 YB_PURE 限定的函数或函数模板的真子集； 不抛出异常。

在文件 ydef.h 第 942 行定义.

## ◆ YB_UNLIKELY

#define YB_UNLIKELY | ( |  | _expr | ) | (_expr)

分支预测提示。

自从
  build 313

在文件 ydef.h 第 829 行定义.

## ◆ YB_Use_YAssert

#define YB_Use_YAssert 1

使用断言。

自从
  build 313

在文件 ydef.h 第 1016 行定义.

## ◆ YB_Use_YTrace

#define YB_Use_YTrace 1

使用调试跟踪记录。

自从
  build 313

在文件 ydef.h 第 1021 行定义.

## ◆ yconstexpr

#define yconstexpr

指定编译时常量表达式。

注解
  同 C++11 constepxr 作用于编译时常量的语义。

自从
  build 246

在文件 ydef.h 第 1073 行定义.

## ◆ yconstexpr_inline

#define yconstexpr_inline yconstexpr

可选的内联 constexpr 变量。

警告
  不应依赖变量的链接以避免可能造成违反 ODR 。

自从
  build 831

在文件 ydef.h 第 1086 行定义.

## ◆ yconstfn

#define yconstfn inline

指定编译时常量函数。

注解
  同 C++11 constepxr 作用于编译时常量函数的语义。

自从
  build 266

在文件 ydef.h 第 1074 行定义.

## ◆ yconstfn_relaxed

#define yconstfn_relaxed inline

指定编译时没有 C++11 限制和隐式成员 const 的常量函数。

注解
  同 C++14 constepxr 作用于编译时常量函数的语义。

自从
  build 591

在文件 ydef.h 第 1098 行定义.

## ◆ yfname

#define yfname "<unknown-fn>"

展开为表示函数名的预定义变量的宏。

自从
  build 628

待办事项:
  判断语言实现版本。

在文件 ydef.h 第 1114 行定义.

## ◆ yfsig

#define yfsig "<unknown-fsig>"

展开为表示函数签名的预定义变量的宏。

自从
  build 628

待办事项:
  判断语言实现版本。

在文件 ydef.h 第 1134 行定义.

## ◆ yimpl

#define yimpl | ( |  | ... | ) | __VA_ARGS__

实现标签。

自从
  build 474

待办事项:
  检查语言实现的必要支持：可变参数宏。

接口代码中标注不作为公开接口实现而不应被用户依赖具体内容的部分的宏。 类似于 ISO C++ 中的 `unspecified` 或标识为 `exposition only` 部分的代码。 保证记号被原样替换。 以 `yimpl()` 的形式使用时可用于表示实现可选扩展的接口，用于序列末尾等。

在文件 ydef.h 第 414 行定义.

## ◆ ynoexcept

#define ynoexcept | ( |  | ... | ) |

YSLib 无异常抛出保证：指定特定的异常规范。

自从
  build 319

在文件 ydef.h 第 1152 行定义.

## ◆ ynoexcept_assert

#define ynoexcept_assert | ( |  | _msg,
|  |  | ...
| ) |  |

表达式 `noexcept` 静态断言。

自从
  build 586

在文件 ydef.h 第 1153 行定义.

## ◆ ynoexcept_param

#define ynoexcept_param | ( |  | _n | ) |

影响函数类型的 noexcept 限定符参数。

自从
  build 845

在文件 ydef.h 第 1173 行定义.

## ◆ ynoexcept_qual

#define ynoexcept_qual | ( |  | ... | ) |

影响函数类型的 noexcept 限定符表达式。

自从
  build 845

在文件 ydef.h 第 1174 行定义.

## ◆ ynoexcept_spec

#define ynoexcept_spec | ( |  | ... | ) | ynoexcept(noexcept(__VA_ARGS__))

表达式 `noexcept` 异常规范。

自从
  build 586

在文件 ydef.h 第 1182 行定义.

## ◆ ynothrow

#define ynothrow ythrow()

YSLib 无异常抛出保证：若支持 noexcept 关键字， 指定特定的 noexcept 异常规范。

注解
  YB_IMPL_MSCPP >= 1200 时支持 __declspec(nothrow) 行为和 throw() 基本一致， 但语法（顺序）不同。
  指定 ynothrow 的函数具有 wide constraint ， 即保证违反前置条件不引起未定义行为。

参见
  ynothrowv
  ynoexcept

在文件 ydef.h 第 1200 行定义.

被这些函数引用 ystdex::pmr::resource_pool::allocate(), ystdex::pmr::oversized_map::allocate(), YSLib::UI::MUIContainer::Contains(), platform_ex::Windows::ConvertToErrno(), ystdex::copy_when(), ystdex::thread_pool::enqueue(), YReader::FetchImage(), ystdex::path< _tSeqCon, _tTraits >::filter_self(), platform::FAT::LFN::GenerateAliasChecksum(), YSLib::Drawing::ImplDeDtor(), CHRLib::ImplRet(), YReader::ShlTextReader::LoadFile(), NPL::A1::Forms::LoadModule_SHBuild(), NPL::A1::Forms::LoadModule_std_strings(), ystdex::pmr::cpp2017::new_delete_resource(), ystdex::pmr::cpp2017::null_memory_resource(), ystdex::id< _type >::operator add_ptr_t< _type(), ystdex::id< void >::operator add_ptr_t< _type(), NPL::A1::PassesCombiner::operator()(), NPL::A1::SeparatorTransformer::operator()(), NPL::A1::SeparatorTransformer::Process(), NPL::A1::QuerySourceInformation(), ystdex::details::list_node_base::reverse_nodes(), NPL::A1::ContextState::RewriteGuarded(), CHRLib::UCS2ToUCS4(), CHRLib::UCS4ToUCS2(), platform::FAT::LFN::ValidateName(), ystdex::task_pool::wait(), ystdex::task_pool::wait_for(), ystdex::thread_pool::wait_to_enqueue(), ystdex::task_pool::wait_until() , 以及 ystdex::yassert().

## ◆ ynothrowv

#define ynothrowv

YSLib 无异常抛出保证验证：有条件地使用无异常抛出规范。

注解
  指定 ynothrowv 的函数具有 narrow contract 形式的约束条件， 即不保证违反前置条件时不引起未定义行为。

参见
  ynothrow

自从
  build 461

按 WG21 N3248 要求，表示 narrow contract 形式的约束条件的无异常抛出接口。 对应接口违反约束可引起未定义行为。 因为可能显著改变程序的可观察行为，需要允许抛出异常进行验证时不适用。 除非能静态验证不抛出异常，一般只应直接或间接调用 ynothrow 安全修饰的函数。 验证结束后，确保不存在未定义行为时可以启用以提升性能。

在文件 ydef.h 第 1220 行定义.

## ◆ YPP_Args

#define YPP_Args | ( |  | ... | ) | __VA_ARGS__

替换列表。

注解
  通过括号保护，可用于传递带逗号的参数。

自从
  build 689

在文件 ydef.h 第 362 行定义.

## ◆ YPP_Comma

#define YPP_Comma ,

替换为逗号的预处理记号。

注解
  可用于代替宏的实际参数中出现的逗号。

在文件 ydef.h 第 371 行定义.

## ◆ YPP_Concat

#define YPP_Concat | ( |  | _x,
|  |  | _y
| ) |  | _x ## _y

记号连接。

参见
  YPP_Join

在文件 ydef.h 第 377 行定义.

## ◆ YPP_Empty

#define YPP_Empty

替换为空的预处理记号。

在文件 ydef.h 第 365 行定义.

## ◆ YPP_Join

#define YPP_Join | ( |  | _x,
|  |  | _y
| ) |  | YPP_Concat(_x, _y)

带宏替换的记号连接。

参见
  WG21 N4140 16.3.3[cpp.concat]/3 。
  http://gcc.gnu.org/onlinedocs/cpp/Concatenation.html 。
  https://www.securecoding.cert.org/confluence/display/cplusplus/PRE05-CPP.+Understand+macro+replacement+when+concatenating+tokens+or+performing+stringification 。

注意 ISO C++ 未确定宏定义内 # 和 ## 操作符求值顺序。 注意宏定义内 ## 操作符修饰的形式参数为宏时，此宏不会被展开。

在文件 ydef.h 第 388 行定义.

## ◆ YPP_Stringify

#define YPP_Stringify | ( |  | _x | ) | #_x

替换预处理记号为字符串。

自从
  build 715

在文件 ydef.h 第 394 行定义.

## ◆ YPP_Stringize

#define YPP_Stringize | ( |  | _x | ) | YPP_Stringify(_x)

替换被宏替换的预处理记号为字符串。

自从
  build 880

在文件 ydef.h 第 400 行定义.

## ◆ ythread

#define ythread

线程局部存储：若实现支持，指定为 `thread_local` 。

警告
  MinGW GCC 使用的 emutls 实现缺陷导致静态初始化可能失败。

自从
  build 425

待办事项:
  加入 `__thread` 和 `__declspec(thread)` 。

在文件 ydef.h 第 1244 行定义.

## ◆ ythrow

#define ythrow | ( |  | ... | ) |

YSLib 动态异常规范：根据是否使用异常规范宏指定或忽略动态异常规范。

注解
  动态异常规范已从 ISO C++17 移除，用户代码不应假定支持。
  主要为可读性保留， ythrow = "yielded throwing" 。

参见
  WG21 P0003R5 。

在文件 ydef.h 第 1257 行定义.

## ◆ yunused

#define yunused | ( |  | ... | ) | static_cast<void>(__VA_ARGS__)

标记未使用的表达式。

注解
  显式转换为 void 类型以标记表达式未被作为子表达式使用，可避免某些实现的警告。

警告
  避免在表达式中误用逗号。

自从
  build 435

在文件 ydef.h 第 1459 行定义.

__has_extension
#define __has_extension(...)
Definition: ydef.h:162
platform::KeyCodes::DS::L
@ L
Definition: Keys.h:228
__has_feature
#define __has_feature(...)
Definition: ydef.h:166