2015-03-08 2 views
7

Как я могу проверить/развернуть все макросы функций в файле C/C++, не запуская его через препроцессор? Например, есть программа или метод, который изменит это:Развернуть макрос функций C/C++ без препроцессора

#include <iostream> 
#define AAA(a) cout << "function " << a << endl 
using namespace std; 
int main(){ 
AAA(12); 
} 

в это?

#include <iostream> 
using namespace std; 
int main(){ 
cout << "function " << 12 << endl; 
} 

Я не хочу, чтобы запустить через препроцессор, потому что все включает в файлах сделать «ССАГПЗ -E <>» выход действительно некрасиво, я просто хочу пару простых расширений макросов без всех накладных расходов.

+3

Возможно, вы могли бы написать код, который использует clang как библиотеку, и использовать его препроцессор. Если 'grep -v^\ # include myfile | gcc -E' вам не подходит. –

+0

Resharper для C++ позволяет это сделать. – chris

+0

Спасибо за предложение Маты, я посмотрю на Клана. Тем не менее, он будет итерировать более 33k + строк кода, поэтому я думаю, что grep окажется немного грязным. Я сейчас на mac, но я буду прыгать на виртуальную машину и дать Resharper выстрел тоже. – Involution

ответ

-1

Предположим, вы хотите видеть file.c. Если он содержит основную функцию, вам нужно будет изменить имя этой функции, чтобы это работало. Следующий файл распечатывает файл stdout, только с умеренным добавлением уродства.

#include "file.c" 
#include <stdio.h> 

#define X(...) #__VA_ARGS__ 

void print_file(char* s) 
{ 
    // a loop here to move through s until some identifier is found 
    // in the original file, say a comment that says: //___START___HERE___ 
    while(*s){ 
     if(*s=='{' | *s=='}' | *s=='#') printf("\n"); 
     printf("%c",*s); 
     if(*s==';') printf("\n"); 
     } 
} 

int main(int argc, char* argv[]) 
{ 
    print_file(X(
    #include "file.c" 
    )); 
    return 0; 
} 
+0

Это будет печатать все включено в файл. – Puppy

+0

@Puppy, это действительно незначительная проблема. Вы просто не печатаете до тех пор, пока не найдете имя, которое было изменено, или какой-либо заданный комментарий или что-то еще. Это похоже на 2 строки дополнительного кода. – Kyle

+0

Правильный синтаксический анализ кода на C++ далек от тривиального. – Puppy

2

Нет, это невозможно. Например, ваши включенные заголовки могут включать макросы, которые вы хотите расширить в теле. Или вы не хотите расширять макросы, которые поступают из заголовков? Препроцессор не имеет абсолютно никакого способа отличить то, что вы хотите от того, чего вы не хотите в этом случае.

Если вы знаете заранее, это не так, то я рекомендую просто написать сценарий для удаления включений, а затем запустить его через препроцессор.

1

Я слышал все возможные негативные ответы по теме:

  • макросы могут быть расширены только не оценивали
  • процессор должен анализировать также включать в себя файлы
  • вложенные макросы могут быть чрезмерно сложной
  • условно предварительная обработка может быть сложной
  • макросы являются злыми, избегают их
  • и т.д. и т. Д.

Все они правда, но ИМО они сталкиваются с реальностью программирования каждый день.

Фактически, работая над старым проектом C, где макросы были в основном просто использованы в качестве функций, это приобрело для меня решающее значение. Генерирование всех предварительно обработанных файлов с помощью/P работает, но является излишним и занимает время. Мне просто нужен инструмент, который расширяет простой макрос, определяемый несколькими строками выше или максимум в другом файле.

Как это сделать?

1 Onl, inux просто использовать GDB и его расширения макросов возможности 2 На окнах я использую https://www.jetbrains.com/resharper-cpp/ интегрирован в Visual Studio

Так, Да, в практическом смысле, это возможно.

Смежные вопросы