Вы не можете выполнить именно то, что хотите, поскольку к тому моменту, когда компилятор получает выходной сигнал перед процессором, маркер «ОДИН» уже давно ушел. Однако, если ваша цель состоит в том, чтобы написать список констант один раз, но создать как токены, так и строки, это можно сделать.
Во-первых, используйте макрос для создания констант как перечислений в файле заголовка. enums.h Файл:
#ifndef ENUMS_H
#define ENUMS_H
#ifndef ENUM
#define ENUM(name,val) enum { name = val };
#endif
ENUM(ONE,1)
ENUM(TWO,2)
ENUM(THREE,3)
#endif /* ENUMS_H */
Во-вторых, пересмотреть макрос в .c файле, чтобы создать/целое отображение строк и включают в себя .h файл в нужном месте. Файл enums.c:
#include
#include
typedef struct {
char *str;
int val;
} DescriptiveEnum;
static DescriptiveEnum enums[] = {
#define ENUM(name,val) { #name, val },
#include "enums.h"
};
#define NUM_ENUMS (sizeof(enums)/sizeof(enums[0]))
char *enum_to_str(int val)
{
int i;
for (i=0;i<NUM_ENUMS;i++) {
if (enums[i].val == val) return enums[i].str;
}
return "";
}
Теперь как константы перечисления, так и функция отображения доступны для абонентов. Файл main.c:
#include <stdio.h>
#include <stdlib.h>
#include "enums.h"
char *enum_to_str(int val);
int main(int argc, char *argv[])
{
int val;
val = ONE;
printf("%d %s\n",val,enum_to_str(val));
return EXIT_SUCCESS;
}
Это то, что я получал, когда упоминал Карты сообщений Windows, которые, я считаю, используют аналогичный механизм. –
Это действительно не отвечает на исходный вопрос. Он хочет динамически печатать макрос «имя» на основе значения переменной. –