Вы не можете делать именно то, что вам нужно, поскольку к тому времени, когда компилятор получает выходные данные препроцессора, токен "ONE" уже давно исчез. Однако, если ваша цель состоит в том, чтобы написать список констант один раз, но сгенерировать как токены, так и строки, то это можно сделать.
Сначала используйте макрос для построения констант в виде перечислений в заголовочном файле. Файл 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;
}