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_