c-lineup-cpp-define is a compiled Lisp function in `cc-align.el'.

(c-lineup-cpp-define LANGELEM)

Line up macro continuation lines according to the indentation of
the construct preceding the macro. E.g.:

v beg of preceding constr v beg of preceding constr
int dribble() {
const char msg[] = if (!running)
"Some text."; error("Not running!");

#define X(A, B) #define X(A, B) do { <-> do { <- c-lineup-cpp-define
printf (A, B); printf (A, B); } while (0) } while (0)

If `c-syntactic-indentation-in-macros' is non-nil, the function
returns the relative indentation to the macro start line to allow
accumulation with other offsets. E.g. in the following cases,
cpp-define-intro is combined with the statement-block-intro that comes
from the "do {" that hangs on the "#define" line:

int dribble() {
const char msg[] = if (!running)
"Some text."; error("Not running!");

#define X(A, B) do { #define X(A, B) do { printf (A, B); <-> printf (A, B); <- c-lineup-cpp-define
this->refs++; this->refs++; } while (0) <-> } while (0) <- c-lineup-cpp-define

The relative indentation returned by `c-lineup-cpp-define' is zero and
two, respectively, in these two examples. They are then added to the
two column indentation that statement-block-intro gives in both cases

If the relative indentation is zero, then nil is returned instead.
That is useful in a list expression to specify the default indentation
on the top level.

If `c-syntactic-indentation-in-macros' is nil then this function keeps
the current indentation, except for empty lines (ignoring the ending
backslash) where it takes the indentation from the closest preceding
nonempty line in the macro. If there's no such line in the macro then
the indentation is taken from the construct preceding it, as described

Works with: cpp-define-intro.