2013-07-15 2 views
0

Я новичок в этом форуме поэтому, пожалуйста, идти просто на меня :)Как выход #define значение

У меня есть следующие в моем коде

#define SYS_SBS  0x02 

Всякий раз, когда я пытаюсь использовать это и попробовать для вывода, я получаю 2 как значение, однако я хочу получить SYS_SBS в качестве вывода для моей программы. Есть ли способ, я могу это сделать.

У меня нет контроля над исходным кодом. Мне просто нужно выводить SYS_SBS.

Дополнительная информация: Я не могу изменить некоторые файлы заголовков. Однако я могу изменить основную функцию в файле .cpp. Я хочу, чтобы SYS_SBS был выходным. Я работаю со спутниками и для всех спутников, обнаруженных моим приемником, я должен вывести, какой тип сателлита они есть. В коде все они определены с этим шестнадцатеричным числом. Я просто хочу, чтобы выходные SYS_SBS и не 2

+4

Я не думаю, что вы можете, потому что препроцессор заменит все SYS_SBS на значение – Alexis

+5

Если вы хотите, чтобы 'SYS_SBS' как вывод, просто вывести' SYS_SBS' –

+2

Похож на вопрос XY. Что вы НАСТОЯТЕЛЬНО пытаетесь сделать? –

ответ

9
#include <stdio.h> 

#define SYS_SBS  0x02 
#define id(x) #x 

int main(){ 
    printf("%s %d\n", id(SYS_SBS), SYS_SBS); 
    return 0; 
} 
+0

Он сказал, что не имеет никакого контроля над исходным кодом. Как он мог редактировать исходный код? –

+3

@AmoghDikshit E.g '> gcc prog.c -Did (x) = # x' или поставить main.cpp – BLUEPIXY

+0

Это по сути то же самое, что просто печатать« SYS_SBS »напрямую. В частности, он не выполняет какой-либо проверки здравомыслия. Если у вас есть опечатка в параметре вашего макроса 'id()', вы заметите только один раз, когда будет слишком поздно. Вопрос немного странный, но этот ответ действительно не намного лучше. – ComicSansMS

2

0x02 является шестнадцатеричным представлением в источнике. Как только вы его скомпилировали, это всего лишь номер (2).

Если вы хотите напечатать его как шестнадцатеричный, то, ну ... напечатайте его как шестнадцатеричный (например: используйте строку форматирования "0x%.2x").

Ну, вы могли бы просто:

printf("SYS_SBS"); 

Но я предполагаю, что у вас есть номер, как «вход» (как 2), и хотите вывести строку SYS_SBS, хорошо, что не сразу можно. Лучшее, что вы можете сделать, это создать таблицу поиска, например:

const char* sys_strings[] = { "SYS_EX", "SYS_TEM", "SYS_SBS" }; 
+2

OP хочет макрос _name_, а не его значение. – JBL

+1

@JBL, который не является на 100% понятным – doctorlove

+1

@doctorlove «Я хочу получить SYS_SBS в качестве вывода для моей программы». Мне это кажется ясным. – JBL

3

стандарт C обеспечивает stringification оператор (добавить # перед маркером), что позволяет outuput специфического маркера.

Невозможно преобразовать обратное от значения переменной в это имя токена, поскольку это потеряно во время переводов (как упоминалось в других источниках). Если вам нужно что-то преобразования, думать о явной функции «value2str», который возвращает строковое представление заданного значения:

const char *myType2str(int value) 
{ 
    switch (value) 
    { 
     case SYS_SBS: 
      return "SYS_SBS"; 

     default: 
      return "UNKNOWN VALUE"; 
    } 
} 

EDIT: Согласно некоторым комментариям, stringification является частью стандарта. Это изменилось. Спасибо за подсказку. Не знал об этом.

+4

некоторые? Строение является частью стандарта. –

+1

Не некоторые, все компиляторы C и C++ предоставляют это. – Potatoswatter

+0

@refp благодарит за подсказку. Не знал, что это стандартная функция. – junix

Смежные вопросы