Запускать только препроцессор, но только для определенных операторов - PullRequest
14 голосов
/ 03 января 2012

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

Чтобы сделать это, я сначала посмотрел на GCC -EАргумент командной строки, который запускает только препроцессор, однако он сделал гораздо больше, чем я хотел, расширив включенные файлы и добавив операторы #line.

Например:

#include <stdio.h>

#ifdef DEBUG
    #define debug( s ) puts ( s );
#else
    #define debug( s )
#endif

int main( int argc, char* argv[] )
{
    debug( "Foo" )

    puts( "Hello, World!" );

    return 0;
}

Я быхочу, чтобы это было обработано до:

#include <stdio.h>

int main( int argc, char* argv[] )
{


    puts( "Hello, World!" );

    return 0;
}

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

Ответы [ 5 ]

4 голосов
/ 12 января 2012

gcc -E -nostdinc test.c выдает

# 1 "test.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "test.c"
# 9 "test.c"
int main( int argc, char* argv[] )
{


    puts( "Hello, World!" );

    return 0;
}

и ошибку в stderr

test.c:1:19: error: no include path in which to search for stdio.h

Вы можете легко отфильтровать # строк ... и заново добавить включения.

3 голосов
/ 03 января 2012

Если -E не помогает, попробуйте использовать -fdump-tree-all, и если вы не видите, что вы хотите, то, что недоступно (или) не предоставлено GCC.

OTOH, этот вопрос обсуждался в SO следующим образом, пожалуйста, обратитесь к ниже, чтобы получить некоторые идеи.

  1. Может ли gcc вывести код C после предварительной обработки?
  2. Как мне увидеть исходный файл C / C ++ после предварительной обработки в Visual Studio?

Надеюсь, это поможет!


Привет, Мат,

Я видел ваш комментарий к @nos. Но у меня есть один такой удобный скрипт, и я делюсь им с вами. Вы можете попробовать прочитать мой ответ на похожий вопрос здесь

Скопируйте приведенный ниже код в файл, скажем convert.sh. Назначьте разрешение на выполнение этому файлу chmod +x convert.sh и запустите его следующим образом:

$./convert.sh <filename>.c
$cat filename.c.done

У <filename>.c.done будет то, что вам нужно!

#!/bin/bash

if [[ $# -ne 1 || ! -f $1 ]] ; then
    echo "Invalid args / Check file "
    exit 
fi

file_name=$1

grep '^\s*#\s*include' $file_name > /tmp/include.c
grep -Pv '^\s*#\s*include\b' $file_name > /tmp/code.c
gcc -E /tmp/code.c | grep -v ^# > /tmp/preprocessed.c
cat /tmp/include.c > $file_name.done
cat /tmp/preprocessed.c >> $file_name.done

Надеюсь, это поможет!

2 голосов
/ 19 апреля 2013

Можно использовать такие инструменты, как unifdef, unifdefall - удалить условные выражения препроцессора из кода.( Запустить «легкий» препроцессор для GCC )

2 голосов
/ 12 января 2012

Нет прямого способа сделать это с препроцессором gcc, хотя, если вы включите только системные заголовки, вам может повезти с gcc -E -nostdinc.

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

1 голос
/ 24 мая 2017

Я знаю, что вопрос старый, но сейчас у него есть ответ. «Частичный препроцессор C» делает именно это.

http://www.muppetlabs.com/~breadbox/software/cppp.html

Для справки, если кто-то еще интересуется (я нашел и нашел эту страницу).

...