Разрешенный дамп gcc определяет - PullRequest
1 голос
/ 27 сентября 2011

У меня есть код, подобный

#define ONE 1
#define TWO 2
#define SUM (ONE+TWO)

Как вывести дамп SUM как «3», разрешенное значение в gcc 4.3 +?

gcc -dM -E foo.h только для дамповявляется.Как получить фактическое значение, как будто оно вставлено на этапе компиляции?

Ответы [ 4 ]

2 голосов
/ 27 сентября 2011

Вы не можете.Что касается компилятора, строка printf("%d\n", SUM) перед предварительной обработкой неотличима от строки printf("%d\n", 1+2).Случается, что компилятор выполняет оптимизацию под названием постоянное свертывание , даже на уровне оптимизации по умолчанию (-O0), который превращает результат в константу 3 во время выполнения.

На самом деле нетхороший способ увидеть результаты этих оптимизаций.Вы можете использовать опцию -S, чтобы просмотреть сгенерированный ассемблерный код и посмотреть, как он выглядит, но если ваша программа - нечто большее, чем игрушка, это потребует больших ручных усилий.Вы также можете посмотреть на дерево разбора, используя один из параметров -fdump-tree (см. Справочную страницу GCC).

1 голос
/ 28 сентября 2011

Вопреки другим ответам, определенно есть решение этой проблемы, особенно с расширениями gcc. Разобрать выходные данные gcc -dM и сгенерировать файл C, содержащий строки вида __typeof__(MACRO) foo = MACRO; и перейти оттуда. Без __typeof__ вы все равно могли бы обрабатывать все арифметические типы достаточно хорошо, просто используя long double.

1 голос
/ 27 сентября 2011

Вы не можете "сбросить" SUM как 3, потому что SUM - это не 3 в каком-либо значимом смысле, это просто последовательность из трех токенов ONE, + и TWO. То, во что это превращается, зависит от контекста, в котором оно раскрывается.

Макросы раскрываются там, где они появляются в источнике, замены макросов до сих пор были просто цепочками токенов.

Вы можете проверить это следующим образом.

#include <stdio.h>

#define ONE 1
#define TWO 2
#define SUM ONE+TWO
int a = SUM;
#undef ONE
#define ONE 2
int b = SUM;

int main()
{
     printf("a = %d\nb = %d\n", a, b);
     return 0;
}

Вот еще один пример:

#include <stdio.h>
#define ONE 1
#define TWO 2
#define SUM ONE+TWO
int main()
{
     /* prints 6, not 2 */
     printf("5 - SUM = %d\n", 5 - SUM);
     return 0;
}

С помощью этого примера вы не сможете оправдать SUM быть 3.

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

Один из способов - остановиться на этапе прекомпиляции (-E) и проверить этот вывод.

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