UDocumentation
UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
PreprocessorHelpers.h
Go to the documentation of this file.
1
// Copyright Epic Games, Inc. All Rights Reserved.
2
3
#pragma once
4
5
// Turns an preprocessor token into a real string (see UBT_COMPILED_PLATFORM)
6
#define UE_STRINGIZE(Token) UE_PRIVATE_STRINGIZE(Token)
7
#define UE_PRIVATE_STRINGIZE(Token) #Token
8
9
// Concatenates two preprocessor tokens, performing macro expansion on them first
10
#define UE_JOIN(TokenA, TokenB) UE_PRIVATE_JOIN(TokenA, TokenB)
11
#define UE_PRIVATE_JOIN(TokenA, TokenB) TokenA##TokenB
12
13
// Concatenates the first two preprocessor tokens of a variadic list, after performing macro expansion on them
14
#define UE_JOIN_FIRST(Token, ...) UE_PRIVATE_JOIN_FIRST(Token, __VA_ARGS__)
15
#define UE_PRIVATE_JOIN_FIRST(Token, ...) Token##__VA_ARGS__
16
17
// Expands to the second argument or the third argument if the first argument is 1 or 0 respectively
18
#define UE_IF(OneOrZero, Token1, Token0) UE_JOIN(UE_PRIVATE_IF_, OneOrZero)(Token1, Token0)
19
#define UE_PRIVATE_IF_1(Token1, Token0) Token1
20
#define UE_PRIVATE_IF_0(Token1, Token0) Token0
21
22
// Expands to the parameter list of the macro - used to pass a *potentially* comma-separated identifier to another macro as a single parameter
23
#define UE_COMMA_SEPARATED(First, ...) First, ##__VA_ARGS__
24
25
// Expands to a number which is the count of variadic arguments passed to it.
26
#define UE_VA_ARG_COUNT(...) UE_APPEND_VA_ARG_COUNT(, ##__VA_ARGS__)
27
28
// Expands to a token of Prefix##<count>, where <count> is the number of variadic arguments.
29
//
30
// Example:
31
// UE_APPEND_VA_ARG_COUNT(SOME_MACRO_) => SOME_MACRO_0
32
// UE_APPEND_VA_ARG_COUNT(SOME_MACRO_, a, b, c) => SOME_MACRO_3
33
#if !defined(_MSVC_TRADITIONAL) || !_MSVC_TRADITIONAL
34
#define UE_APPEND_VA_ARG_COUNT(Prefix, ...) UE_PRIVATE_APPEND_VA_ARG_COUNT(Prefix, ##__VA_ARGS__, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
35
#else
36
#define UE_APPEND_VA_ARG_COUNT(Prefix, ...) UE_PRIVATE_APPEND_VA_ARG_COUNT_INVOKE(UE_PRIVATE_APPEND_VA_ARG_COUNT, (Prefix, ##__VA_ARGS__, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0))
37
38
// MSVC's traditional preprocessor doesn't handle the zero-argument case correctly, so we use a workaround.
39
// The workaround uses token pasting of Macro##ArgsInParens, which the conformant preprocessor doesn't like and emits C5103.
40
#define UE_PRIVATE_APPEND_VA_ARG_COUNT_INVOKE(Macro, ArgsInParens) UE_PRIVATE_APPEND_VA_ARG_COUNT_EXPAND(Macro##ArgsInParens)
41
#define UE_PRIVATE_APPEND_VA_ARG_COUNT_EXPAND(Arg) Arg
42
#endif
43
#define UE_PRIVATE_APPEND_VA_ARG_COUNT(Prefix,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,Count,...) Prefix##Count
44
45
// Expands to nothing - used as a placeholder
46
#define UE_EMPTY
47
48
// Expands to nothing when used as a function - used as a placeholder
49
#define UE_EMPTY_FUNCTION(...)
50
51
// Removes a single layer of parentheses from a macro argument if they are present - used to allow
52
// brackets to be optionally added when the argument contains commas, e.g.:
53
//
54
// #define DEFINE_VARIABLE(Type, Name) UE_REMOVE_OPTIONAL_PARENS(Type) Name;
55
//
56
// DEFINE_VARIABLE(int, IntVar) // expands to: int IntVar;
57
// DEFINE_VARIABLE((TPair<int, float>), PairVar) // expands to: TPair<int, float> PairVar;
58
#define UE_REMOVE_OPTIONAL_PARENS(...) UE_JOIN_FIRST(UE_PRIVATE_PREPROCESSOR_REMOVE_OPTIONAL_PARENS,UE_PRIVATE_PREPROCESSOR_REMOVE_OPTIONAL_PARENS __VA_ARGS__)
59
#define UE_PRIVATE_PREPROCESSOR_REMOVE_OPTIONAL_PARENS(...) UE_PRIVATE_PREPROCESSOR_REMOVE_OPTIONAL_PARENS __VA_ARGS__
60
#define UE_PRIVATE_PREPROCESSOR_REMOVE_OPTIONAL_PARENSUE_PRIVATE_PREPROCESSOR_REMOVE_OPTIONAL_PARENS
61
62
// setup standardized way of including platform headers from the "uber-platform" headers like PlatformFile.h
63
#ifdef OVERRIDE_PLATFORM_HEADER_NAME
64
// allow for an override, so compiled platforms Win64 and Win32 will both include Windows
65
#define PLATFORM_HEADER_NAME OVERRIDE_PLATFORM_HEADER_NAME
66
#else
67
// otherwise use the compiled platform name
68
#define PLATFORM_HEADER_NAME UBT_COMPILED_PLATFORM
69
#endif
70
71
#define UE_SOURCE_LOCATION TEXT(__FILE__ "(" UE_STRINGIZE(__LINE__) ")")
72
73
#ifndef PLATFORM_IS_EXTENSION
74
#define PLATFORM_IS_EXTENSION 0
75
#endif
76
77
#if PLATFORM_IS_EXTENSION
78
// Creates a string that can be used to include a header in the platform extension form "PlatformHeader.h", not like
79
// below form. When using this you should add "// IWYU pragma: export" at the end of the line.
80
#define COMPILED_PLATFORM_HEADER(Suffix) PREPROCESSOR_TO_STRING(PREPROCESSOR_JOIN(PLATFORM_HEADER_NAME, Suffix))
81
#else
82
// Creates a string that can be used to include a header in the form "Platform/PlatformHeader.h", like
83
// "Windows/WindowsPlatformFile.h". When using this you should add "// IWYU pragma: export" at the end of the line.
84
#define COMPILED_PLATFORM_HEADER(Suffix) PREPROCESSOR_TO_STRING(PREPROCESSOR_JOIN(PLATFORM_HEADER_NAME/PLATFORM_HEADER_NAME, Suffix))
85
#endif
86
87
// Creates a string that can be used to include a header in the platform extension form "PlatformHeader.h", but will
88
// not include a directory like COMPILED_PLATFORM_HEADER does, generally for UBT generated headers.
89
#define COMPILED_PLATFORM_HEADER_GENERATED(Suffix) PREPROCESSOR_TO_STRING(PREPROCESSOR_JOIN(PLATFORM_HEADER_NAME, Suffix))
90
91
#if PLATFORM_IS_EXTENSION
92
// Creates a string that can be used to include a header with the platform in its name, like
93
// "Prefix/PlatformNameSuffix.h". When using this you should add "// IWYU pragma: export" at the end of the line.
94
#define COMPILED_PLATFORM_HEADER_WITH_PREFIX(Prefix, Suffix) PREPROCESSOR_TO_STRING(Prefix/PREPROCESSOR_JOIN(PLATFORM_HEADER_NAME, Suffix))
95
#else
96
// Creates a string that can be used to include a header with the platform in its name, like
97
// "Prefix/PlatformName/PlatformNameSuffix.h". When using this you should add "// IWYU pragma: export" at the end of the
98
// line.
99
#define COMPILED_PLATFORM_HEADER_WITH_PREFIX(Prefix, Suffix) PREPROCESSOR_TO_STRING(Prefix/PLATFORM_HEADER_NAME/PREPROCESSOR_JOIN(PLATFORM_HEADER_NAME, Suffix))
100
#endif
101
102
// These macros should be regarded as deprecated - use the UE_ macros they map to instead.
103
#define PREPROCESSOR_TO_STRING(Token) UE_STRINGIZE(Token)
104
#define PREPROCESSOR_JOIN(TokenA, TokenB) UE_JOIN(TokenA, TokenB)
105
#define PREPROCESSOR_JOIN_FIRST(Token, ...) UE_JOIN_FIRST(Token, ##__VA_ARGS__)
106
#define PREPROCESSOR_IF(OneOrZero, Token1, Token0) UE_IF(OneOrZero, Token1, Token0)
107
#define PREPROCESSOR_COMMA_SEPARATED(First, ...) UE_COMMA_SEPARATED(First, ##__VA_ARGS__)
108
#define PREPROCESSOR_VA_ARG_COUNT(...) UE_VA_ARG_COUNT(__VA_ARGS__)
109
#define PREPROCESSOR_APPEND_VA_ARG_COUNT(Prefix, ...) UE_APPEND_VA_ARG_COUNT(Prefix, ##__VA_ARGS__)
110
#define PREPROCESSOR_NOTHING UE_EMPTY
111
#define PREPROCESSOR_NOTHING_FUNCTION(...) UE_EMPTY_FUNCTION(__VA_ARGS__)
112
#define PREPROCESSOR_REMOVE_OPTIONAL_PARENS(...) UE_REMOVE_OPTIONAL_PARENS(__VA_ARGS__)
Engine
Source
Runtime
Core
Public
HAL
PreprocessorHelpers.h
Generated by
1.9.8