2013-07-27 2 views
-1

Возможно ли получить значение макроса со строкой, содержащей имя #define? Или невозможно получить доступ к макросу через его имя после компиляции кода?Как получить значение макроса со строкой, содержащей имя макроса?

Чтобы указать, что я после:

#define NAME "VALUE" 
char string[5]; 

// I want the content of string to be changeable to access any define 
strncpy(string, "NAME", 4); 
fprintf(stderr, "%s\n", string); 

Я хочу иметь выход: VALUE

EDIT Благодаря ответ Мохамеда я нашел это решение:

#define NAME "VALUE" 
char string[5]; 

strncpy(string, "NAME", 4); 

if(strncmp(string, "NAME", 4) == 0) { 
    fprintf(stderr, "%s\n", NAME); 
} 
+0

макросы работают только на замены текста – aaronman

+1

Sure: 'strncpy (строка, имя, отчество, 4);' –

+0

@ Н2СО3 Не так, что: строка имеет место только для 5 символов и копирование только 4 результатов в "VALU" ... – Jens

ответ

3

использовать имя макроса непосредственно

strncpy(string, NAME, 4); 

Вы не можете редактировать содержимое строки, определяемой макро

макроса оценивается на этапе компиляции. компилятор генерирует второй код (называемый кодом препроцессора). этот код генерируется компилятором, в котором компилятор заменяет макрос на его содержимое.

поэтому, если ваш первый код

#define NAME "VALUE" 
char string[5]; 

strncpy(string, NAME, 4); 
fprintf(stderr, "%s\n", string); 

код, сгенерированный составителя будет

char string[5]; 

strncpy(string, "VALUE", 4); 
fprintf(stderr, "%s\n", string); 

вы можете увидеть код препроцессора с:

gcc -E file.c 
+0

См. добавленный комментарий программы – Genius

+0

Вы не можете редактировать содержимое строки, заданной макросом. ответ обновлен – MOHAMED

+0

Какой смысл копировать 4 символа, когда «VALUE» длиннее? – Jens

2

Нет, не может этого сделать. Макросы заменяются заменяемым текстом во время фазы предварительной обработки, прежде чем сам компилятор C увидит код.