Однострочник для распечатки значения макроса из заголовка - PullRequest
4 голосов
/ 08 сентября 2011

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

Мне нужна однострочная для печатизначение макроса, определенного в этом заголовке.

Как пример:

#define MACRO_A 0x60000000
#define MACRO_B MACRO_A + 0x00010000
//...

Как первый румянец:

echo MACRO_B | ${CPREPROCESSOR} --include /path/to/header

... что почти дает мнето, что я хочу:

# A number of lines that are not important
# ...
0x60000000 + 0x00010000

... однако я пытаюсь не допустить, чтобы это превратилось в огромную последовательность: «направь это туда, а затем направь это…».

Я также пробовал это:

echo 'main(){ printf( "0x%X", MACRO_B ); }' \
  | ${CPREPROCESSOR} --include /path/to/header --include /usr/include/stdio.h

... но он (компилятор gcc) жалуется, что -E требуется при обработке кода на стандартном вводе, поэтому мне приходится писатьво временный файл для компиляции / запуска этого.

Есть ли лучший способ?

-Brian

Ответы [ 5 ]

4 голосов
/ 08 сентября 2011
echo 'void main(){ printf( "0x%X", MACRO_B ); }' \
  | gcc -x c --include /path/to/header --include /usr/include/stdio.h - && ./a.out

сделает это в одной строке.

(Вы неправильно прочитали ошибку, которую GCC выдает при чтении из stdin. Вам нужно -E или -x (необходимо указать, какой язык ожидается))

Кроме того, это int main(), или, если вам все равно, как здесь, просто отбросьте тип возврата полностью.И вам не нужно указывать путь для stdio.h.

Так немного короче:

echo 'main(){printf("0x%X",MACRO_B);}' \
  | gcc -xc --include /path/to/header --include stdio.h - && ./a.out
1 голос
/ 08 сентября 2011

А как насчет tail -n1? Как это:

$ echo C_IRUSR | cpp --include /usr/include/cpio.h | tail -n 1
000400
0 голосов
/ 08 сентября 2011
echo '"EOF" EOF' | cpp --include /usr/include/stdio.h | grep EOF

печать:

"EOF" (-1)
0 голосов
/ 08 сентября 2011

Я думаю, что самым простым способом было бы написать небольшую программу на C, добавить к ней заголовок и вывести желаемый результат. Затем вы можете использовать его в своем скрипте, make-файле или любом другом.

0 голосов
/ 08 сентября 2011

Как насчет искусственной генерации ошибки, содержащей ваше значение MACRO_B, и последующей компиляции кода?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...