'Get the value of a macro using a string with macro name

I have a set of macro definitions that the name only change on the number between "C_" and "_E". What I need is a macro that gets a integer variable and returns the integer value of the corresponding macro definition in case it exists, if it does not exist, it returns "-1" or gives a compile error. Is that possible? The code I need is something like this:

#include <stdio.h>

#define C_1_E 4
#define C_2_E 2
#define C_3_E 0
#define C_4_E 420

#define STR(x) #x
#define STR_MACRO(x) "C_" STR(x) "_E"

#define MACRO_VAL(x) ... // return the value of the macro C_x_E when x=1,2,3 or 4

void main() {
  uint8_t n;
  for(n=1;n<=4;n++) printf("val %u: %u\n",n, MACRO_VAL(STR_MACRO(n)));
}

Expected output:

val 1: 4
val 2: 2
val 3: 0
val 4: 420

According to my search, this is not possible, but I can swear I did cross this solution once, but I didn't need it back then although I thought it could be helpful.



Solution 1:[1]

Token pasting approaches are inappropriate as x is a variable name.

Here is a simplistic approach that will work as long as the macro argument is an expression without side effects:

#include <stdio.h>

#define C_1_E 4
#define C_2_E 2
#define C_3_E 0
#define C_4_E 420

// return the value of the macro C_x_E when x=1,2,3 or 4
#define MACRO_VAL(x)  ((x) == 1 ? C_1_E : \
                       (x) == 2 ? C_2_E : \
                       (x) == 3 ? C_3_E : \
                       (x) == 4 ? C_4_E : -1)

int main() {
    int n;
    for (n = 1; n <= 4; n++)
        printf("val %u: %u\n", n, MACRO_VAL(n));
    return 0;
}

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 chqrlie