2009-02-08 4 views
3

У меня есть файл с около 100 #defines в нем от 1 до 100 и каждый с уникальным строковым значением.Автоматическая замена переменных #defines

Теперь я пытаюсь напечатать это значение, но вместо значения, я хочу напечатать то, что #define. Например:

#define FIRST_VALUE 1 
var = FIRST_VALUE; 
printf("%s", var); 

, и я хочу Printf печатать FIRST_VALUE, а не 1.

Есть ли способ сделать это в C? Или я должен просто написать более 100 блоков кода внутри оператора switch?

ответ

1

После разговора с одним из моих ТА в школе, мы решили, что лучший способ сделать это - написать AWK-скрипт для обработки файла заголовка и автоматически генерировать все необходимые операторы case.

Спасибо, ребята!

12

Вы можете использовать stringification, чтобы добиться того, что вы ищете:

#define FIRST_MACRO 
    #define MACRO_TO_STRING(x) #x 

    #include <stdio.h> 

    main() { 
    printf("%s\n", MACRO_TO_STRING(FIRST_MACRO)); 
    } 

Эта программа будет:

 
FIRST_MACRO 
+0

Это то, что я получал, когда упоминал Карты сообщений Windows, которые, я считаю, используют аналогичный механизм. –

+0

Это действительно не отвечает на исходный вопрос. Он хочет динамически печатать макрос «имя» на основе значения переменной. –

0

Вы не можете выполнить именно то, что хотите, поскольку к тому моменту, когда компилятор получает выходной сигнал перед процессором, маркер «ОДИН» уже давно ушел. Однако, если ваша цель состоит в том, чтобы написать список констант один раз, но создать как токены, так и строки, это можно сделать.

Во-первых, используйте макрос для создания констант как перечислений в файле заголовка. 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; 
}