Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can I capture the underlying value of one macro when defining another?

Imagine I want to #define a macro such that it is equal to the current value of another macro (if such a concept exists).

For example:

#include "def_a.h"  // defines macro A
#define B A

This defines B to be A. If A later changes definition (i.e., through a redefinition) the value of B also changes (because B expands to A at the point of use, which further expands to the new value of A).

What I'd like is some way to "bake in" the value of A into B so that B just expands to the value of A, not A itself.

For example:

#define A first
#define B BAKE_IN(A)
#undef A
#define A second
#define C BAKE_IN(A)
#undef A
#define A third

// here I want B to expand to first, and C to expand to second

Of course BAKE_IN is not a real thing, but I'm wondering if there is some way to achieve this effect.

Now, I didn't really say what should happen if A itself is defined in terms of other macros, but I'm OK both with "one level of expansion" (i.e., B gets the value of A is expanded, so further macros remain) and also "full expansion" (i.e., A is fully expanded, recursively, as it would be at a point of use).

like image 916
BeeOnRope Avatar asked Feb 07 '17 17:02

BeeOnRope


1 Answers

Macros are never replaced in the body of a #define directive, so there is no way to define a macro as the current value of another macro, except for the limited case of macros whose value is a constant arithmetic expression.

In the latter case, you can use BOOST_PP_ASSIGN_SLOT from the Boost preprocessor library. (Although most of the Boost libraries are C++-specific, the Boost preprocessor library works for both C and C++, and has no dependency on any other Boost component.)

like image 146
rici Avatar answered Oct 14 '22 12:10

rici