LINUX.ORG.RU

Вопрос по компилятору gcc

 


0

2

Есть файл в котором куча #define которые зависят друг от друга. Как мне при компиляции вывести сообщение с текстом который в итоге подставиться после определенного #define?

★★

Тебе нужно что-то вроде пошагового исполнения gcc -E, gcc -dD -E?

Посмотри сюда: https://stackoverflow.com/questions/12685785/how-to-see-step-by-step-execution-of-each-line-of-a-macro-expansion-using-gdb

И вот интересный проект:

https://github.com/ptaffet/preprocessor-debug

EXL ★★★★★
()
Последнее исправление: EXL (всего исправлений: 2)
Ответ на: комментарий от voltmod

Как мне при компиляции отобразить все преобразования #define ?

$ cat test.c 
#define M_PI 355.f/113.f

int main() {
    printf("%f\n", M_PI);
    return 0;
}

$ gcc -E test.c 
# 1 "test.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 31 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 32 "<command-line>" 2
# 1 "test.c"


int main() {
    printf("%f\n", 355.f/113.f);
    return 0;
}
EXL ★★★★★
()
Ответ на: комментарий от EXL

printf(«%f\n», 355.f/113.f);

Лол. Очень смешно. В коде подстановку искать? :)

zvezdochiot

anonymous
()
Ответ на: комментарий от voltmod

буду разбираться, что там за влаги в Makefile

А, ты в Makefile добавляешь.

Посмотри пожалуйста есть ли у твоего комплятора флаг -save-temps, если есть – добавь его и должны создасться *.i-файлики с препроцессированным кодом.

EXL ★★★★★
()
Ответ на: комментарий от voltmod

У тебя после того, как ты добавил флаг -E насоздовались препроцессированные файлы вместо объектных, из которых линкер пытается слепить исполнительный бинарь и естественно обламывается. Ты открой текстовым редактором эти .o-файлы и посмотри что в них. Если препроцессированный код – то ищи какой макрос и как у тебя раскрывается; исправляй как тебе нужно в исходниках и убирай -E.

EXL ★★★★★
()
Ответ на: комментарий от EXL

насоздовались препроцессированные файлы вместо объектных

Лол. Вот это «велосипед»! :)

zvezdochiot

anonymous
()
Ответ на: комментарий от voltmod

P.S. Вот ещё есть такое решение без пробрасывания компилятору флагов, если там у тебя что-то простое, один-два макроса:

$ cat test.c 
#include <stdio.h>

#define M_PI 355/113
#define MY_BIG_MACRO \
  int i; \
  printf("integers from 0 to 3:\n"); \
  for (i = 0; i < M_PI; i++) \
    printf("%d ", i); \
  printf("\n");

#define VALUE_TO_STRING(x) #x
#define VALUE(x) VALUE_TO_STRING(x)
#define VAR_NAME_VALUE(var) #var "="  VALUE(var)

#pragma message(VAR_NAME_VALUE(M_PI))
#pragma message(VAR_NAME_VALUE(MY_BIG_MACRO))

int main() {
    MY_BIG_MACRO
    return 0;
}

$ gcc test.c
test.c:15:9: note: #pragma message: M_PI=355/113
 #pragma message(VAR_NAME_VALUE(M_PI))
         ^~~~~~~
test.c:16:9: note: #pragma message: MY_BIG_MACRO=int i; printf("integers from 0 to 3:\n"); for (i = 0; i < 355/113; i++) printf("%d ", i); printf("\n");
 #pragma message(VAR_NAME_VALUE(MY_BIG_MACRO))
         ^~~~~~~

Только pragma message должен поддерживаться компилятором.

EXL ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.