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__)