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

value
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;
}
  1. 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;
  2. inline int addTen(int value)

    5inline int addTen(int value4) {6    return value4 + 10;7}
  3. 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
  1. value ← 2, textReplacementResult ← 22

    9int main() {10    int value→ 2 = 2;1112    int textReplacementResult→ 22 = value2 + 10 * 2;13    int functionResult = addTen(value2) * 2;
  2. inline int addTen(int value)

    5inline int addTen(int value2) {6    return value2 + 10;7}
  3. 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
  1. value ← 8, textReplacementResult ← 28

    9int main() {10    int value→ 8 = 8;1112    int textReplacementResult→ 28 = value8 + 10 * 2;13    int functionResult = addTen(value8) * 2;
  2. inline int addTen(int value)

    5inline int addTen(int value8) {6    return value8 + 10;7}
  3. 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