FTXUI 7.0.3
C++ functional terminal UI.
Loading...
Searching...
No Matches
export.hpp
Go to the documentation of this file.
1// Copyright 2026 Arthur Sonzogni. All rights reserved.
2// Use of this source code is governed by the MIT license that can be found in
3// the LICENSE file.
4
5#ifndef FTXUI_UTIL_EXPORT_H_
6#define FTXUI_UTIL_EXPORT_H_
7
8// 在合併建置中,我們不希望有任何 export/import 標注。
9#if defined(FTXUI_AMALGAMATED)
10#define FTXUI_EXPORT(component)
11#define INSIDE_FTXUI_COMPONENT_IMPL(component) 0
12#else
13
14// 用來標注由名為 |component| 的元件所匯出的符號。請注意,
15// 這只有在對應元件目標的原始碼是以 |IS_FTXUI_$component_IMPL|
16// 定義為 1 進行編譯時,才會產生正確的效果。例如:
17//
18// class FTXUI_EXPORT(FOO) Bar {};
19//
20// 若編譯時 IS_FTXUI_FOO_IMPL=1,則 Bar 會使用下方定義的
21// FTXUI_EXPORT_ANNOTATION 巨集加以標注。否則會使用
22// FTXUI_IMPORT_ANNOTATION 巨集加以標注。
23#define FTXUI_EXPORT(component) \
24 FTXUI_MACRO_CONDITIONAL_(IS_FTXUI_##component##_IMPL, \
25 FTXUI_EXPORT_ANNOTATION, FTXUI_IMPORT_ANNOTATION)
26
27// 指出目前的編譯單元是否作為名為 |component| 的元件之
28// 實作的一部分被編譯。若 |IS_FTXUI_$component_IMPL| 被定義
29// 為 |1|,則展開為 |1|;否則展開為 |0|。
30//
31// 特別要注意的是,即使完全未定義 |IS_FTXUI_$component_IMPL|,
32// 測試 INSIDE_FTXUI_COMPONENT_IMPL(component) 仍然是安全的,
33// 它會如預期展開為 |0|。
34#define INSIDE_FTXUI_COMPONENT_IMPL(component) \
35 FTXUI_MACRO_CONDITIONAL_(IS_FTXUI_##component##_IMPL, 1, 0)
36
37#endif
38
39// 用於標注符號匯出或匯入的編譯器特定巨集。在非元件建置中
40// 為空操作。這些巨集不應被直接大量使用。
41// 應改用上方定義的 FTXUI_EXPORT 巨集。
42#if defined(COMPONENT_BUILD)
43#if defined(WIN32)
44#define FTXUI_EXPORT_ANNOTATION __declspec(dllexport)
45#define FTXUI_IMPORT_ANNOTATION __declspec(dllimport)
46#else // defined(WIN32)
47#define FTXUI_EXPORT_ANNOTATION __attribute__((visibility("default")))
48#define FTXUI_IMPORT_ANNOTATION __attribute__((visibility("default")))
49#endif // defined(WIN32)
50#else // defined(COMPONENT_BUILD)
51#define FTXUI_EXPORT_ANNOTATION
52#define FTXUI_IMPORT_ANNOTATION
53#endif // defined(COMPONENT_BUILD)
54
55// 此點之後是上述巨集實作所使用的幾個內部工具巨集。
56// 不供外部使用。
57
58#define FTXUI_MACRO_EXPAND(x) x
59
60// 用於在兩個字符串中依條件展開其中一個的輔助巨集。若 |condition|
61// 展開為 |1|,則此巨集展開為 |consequent|;否則展開
62// 為 |alternate|。
63#define FTXUI_MACRO_CONDITIONAL_(condition, consequent, alternate) \
64 FTXUI_MACRO_EXPAND(FTXUI_MACRO_SELECT_THIRD_ARGUMENT_( \
65 FTXUI_MACRO_CONDITIONAL_COMMA_(condition), consequent, alternate))
66
67// 若其第一個引數展開為 |1|,則展開為逗號 (,)。與
68// |FTXUI_MACRO_SELECT_THIRD_ARGUMENT_()| 搭配使用,
69// 因為額外逗號的有無可用來依條件移動後續
70// 引數的位置,進而影響選取哪個引數。
71#define FTXUI_MACRO_CONDITIONAL_COMMA_(...) \
72 FTXUI_MACRO_EXPAND(FTXUI_MACRO_CONDITIONAL_COMMA_IMPL_(__VA_ARGS__, dummy))
73#define FTXUI_MACRO_CONDITIONAL_COMMA_IMPL_(x, ...) \
74 FTXUI_MACRO_CONDITIONAL_COMMA_##x##_
75#define FTXUI_MACRO_CONDITIONAL_COMMA_1_ ,
76
77// 僅單純選取其第三個引數的輔助巨集。與
78// 上方的 |FTXUI_MACRO_CONDITIONAL_COMMA_()| 搭配使用,
79// 以實作條件式巨集展開。
80#define FTXUI_MACRO_SELECT_THIRD_ARGUMENT_(...) \
81 FTXUI_MACRO_EXPAND( \
82 FTXUI_MACRO_SELECT_THIRD_ARGUMENT_IMPL_(__VA_ARGS__, dummy))
83#define FTXUI_MACRO_SELECT_THIRD_ARGUMENT_IMPL_(a, b, c, ...) c
84
85#endif // FTXUI_UTIL_EXPORT_H_