Избегайте предварительной обработки #includes - PullRequest
1 голос
/ 05 января 2012

У меня есть несколько источников C, для которых я хочу развернуть макросы #define#ifdefs и т. Д.), Но НЕ #includes.#includes следует оставить без изменений.

Возможно ли это с помощью cpp (препроцессора C)?

Ответы [ 6 ]

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

Прямого пути нет. Итак, я попробовал следующую программу, и она работает для большинства файлов .c, которые у меня есть. Я взял @fge grep и добавил еще немного кода вместе с gcc -E .. Надеюсь, это поможет!

#!/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 голосов
/ 05 января 2012

Нет, это не так, поскольку #include - это инструкция препроцессора.

Единственная возможность, которую вы имеете, - запустить cpp для файлов после удаления #includeинструкции.

Если у вас есть оболочка Unix с GNU grep, это можно сделать, например, с помощью:

grep -Pv '^\s*#\s*include\b' thefile.c|cpp
1 голос
/ 28 июля 2012

Если у вас под рукой Emacs: c-macro-expand связан с C-c C-e может расширить только отмеченную область Это также примет во внимание включения, но ограничит вывод команды отмеченным разделом. Одна из лучших команд, если вы занимаетесь программированием макросов.

1 голос
/ 05 января 2012

Если у вас есть один исходный файл (или только несколько), вы можете прокомментировать директивы #include, например:

#if 0
#include "include1.h" 
#include "include2.h" 
#endif

и затем запустите препроцессор для исходных файлов.

1 голос
/ 05 января 2012

Если эти включенные файлы выглядят следующим образом:

inc_file1.h

#if !defined(INC_FILE1_H)
#define INC_FILE1_H

/// some code

#endif

, вы можете сами определить INC_FILE1_H, в результате чего inc_file1.h внутри объявлений не будет обрабатываться

0 голосов
/ 05 января 2012

С GCC это невозможно.

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