Function-like macros substitute an expression at each call site.

function-like macro A macro can accept arguments, but it still expands as text before compilation.
parentheses Parentheses around arguments and the whole result prevent common precedence bugs.
expanded expression The replay uses the expanded expression directly because macro expansion happens before tracing.

Function Macros

count
function_macros.c
Replay: real traced execution (multi-file project)
#include <stdio.h>

#define DOUBLE(n) ((n) * 2)

int main(void) {
    int count = 4;
    int result = ((count + 1) * 2);

    printf("result=%d\n", result);
    return 0;
}
#include <stdio.h>

#define DOUBLE(n) ((n) * 2)

int main(void) {
    int count = 7;
    int result = ((count + 1) * 2);

    printf("result=%d\n", result);
    return 0;
}
#include <stdio.h>

#define DOUBLE(n) ((n) * 2)

int main(void) {
    int count = 9;
    int result = ((count + 1) * 2);

    printf("result=%d\n", result);
    return 0;
}
  1. count ← 4, result ← 10

    5int main(void) {6    int count→ 4 = 4; //@count=7, 97    int result→ 10 = ((count4 + 1) * 2);89    printf("result=%d\n", result10);10    return 0;11}
    outputresult=10
  1. count ← 7, result ← 16

    5int main(void) {6    int count→ 7 = 7;7    int result→ 16 = ((count7 + 1) * 2);89    printf("result=%d\n", result16);10    return 0;11}
    outputresult=16
  1. count ← 9, result ← 20

    5int main(void) {6    int count→ 9 = 9;7    int result→ 20 = ((count9 + 1) * 2);89    printf("result=%d\n", result20);10    return 0;11}
    outputresult=20