Preprocessor and Build Boundaries
Function Macros
Function-like macros copy text; this example shows the expanded expression beside a safer inline function call.
function-like macro
A function-like macro can look like a function call, but the preprocessor still treats it as text replacement.
Function Macros
function_macros.cpp
Replay: real traced execution (multi-file project)
#include <iostream>
#define ADD_TEN_BAD(x) x + 10
inline int addTen(int value) {
return value + 10;
}
int main() {
int value = 4;
int textReplacementResult = value + 10 * 2;
int functionResult = addTen(value) * 2;
std::cout << "value=" << value << std::endl;
std::cout << "textReplacementResult=" << textReplacementResult << std::endl;
std::cout << "functionResult=" << functionResult << std::endl;
return 0;
}
#include <iostream>
#define ADD_TEN_BAD(x) x + 10
inline int addTen(int value) {
return value + 10;
}
int main() {
int value = 2;
int textReplacementResult = value + 10 * 2;
int functionResult = addTen(value) * 2;
std::cout << "value=" << value << std::endl;
std::cout << "textReplacementResult=" << textReplacementResult << std::endl;
std::cout << "functionResult=" << functionResult << std::endl;
return 0;
}
#include <iostream>
#define ADD_TEN_BAD(x) x + 10
inline int addTen(int value) {
return value + 10;
}
int main() {
int value = 8;
int textReplacementResult = value + 10 * 2;
int functionResult = addTen(value) * 2;
std::cout << "value=" << value << std::endl;
std::cout << "textReplacementResult=" << textReplacementResult << std::endl;
std::cout << "functionResult=" << functionResult << std::endl;
return 0;
}
value ← 4, textReplacementResult ← 24
9int main() {10 int value→ 4 = 4; //@value=2, 81112 int textReplacementResult→ 24 = value4 + 10 * 2;13 int functionResult = addTen(value4) * 2;inline int addTen(int value)
5inline int addTen(int value4) {6 return value4 + 10;7}functionResult ← 28
12 int textReplacementResult = value + 10 * 2;13 int functionResult→ 28 = addTen(value4) * 2;1415 std::cout << "value=" << value4 << std::endl;16 std::cout << "textReplacementResult=" << textReplacementResult24 << std::endl;17 std::cout << "functionResult=" << functionResult28 << std::endl;18 return 0;19}outputvalue=4 textReplacementResult=24 functionResult=28
value ← 2, textReplacementResult ← 22
9int main() {10 int value→ 2 = 2;1112 int textReplacementResult→ 22 = value2 + 10 * 2;13 int functionResult = addTen(value2) * 2;inline int addTen(int value)
5inline int addTen(int value2) {6 return value2 + 10;7}functionResult ← 24
12 int textReplacementResult = value + 10 * 2;13 int functionResult→ 24 = addTen(value2) * 2;1415 std::cout << "value=" << value2 << std::endl;16 std::cout << "textReplacementResult=" << textReplacementResult22 << std::endl;17 std::cout << "functionResult=" << functionResult24 << std::endl;18 return 0;19}outputvalue=2 textReplacementResult=22 functionResult=24
value ← 8, textReplacementResult ← 28
9int main() {10 int value→ 8 = 8;1112 int textReplacementResult→ 28 = value8 + 10 * 2;13 int functionResult = addTen(value8) * 2;inline int addTen(int value)
5inline int addTen(int value8) {6 return value8 + 10;7}functionResult ← 36
12 int textReplacementResult = value + 10 * 2;13 int functionResult→ 36 = addTen(value8) * 2;1415 std::cout << "value=" << value8 << std::endl;16 std::cout << "textReplacementResult=" << textReplacementResult28 << std::endl;17 std::cout << "functionResult=" << functionResult36 << std::endl;18 return 0;19}outputvalue=8 textReplacementResult=28 functionResult=36