2009-11-20 4 views
1

Если бы я мог найти способ сделать что-то похожее на это, я мог бы вырезать сотни строк кода в своем приложении и значительно увеличить ремонтопригодность. У кого-нибудь есть идеи?C Программирование: Препроцессор, включить файлы из макроса

#include <stdio.h> 

int main() 
{ 
    #define include_all_files(root) \ 
      #include #root "1.h" \ 
      #include #root "2.h" \ 
      #include #root "3.h" \ 
      #include #root "4.h" 

    include_all_files(first_library) 
    include_all_files(second_library) 
    include_all_files(third_library) 

    return 0; 
} 

EDIT:

Я ценю ответы, мой пример, кажется, вызывает Misdirection в усилии, так вот проблема я на самом деле пытается решить:

Я реализующий конечный автомат. Через именовании, я получил его, чтобы быть столь же просто, чтобы добавить состояние как:

STATE(initial_screen) 
    #include "initial_screen.state" 
    END_STATE 

    STATE(login) 
    #include "login.state" 
    END_STATE 

Однако, если бы я мог ответить на первоначальный вопрос, я мог бы реорганизовать это вниз к чему-то же просто, как:

ADD_STATE(initial_screen) 
    ADD_STATE(login) 

Это связано с тем, что имя файла и имя состояния, а также все основные проводки и все остальное все соответствуют аналогичным соглашениям. Однако я не могу понять, как реализовать файл include на основе маркера, полученного в макросе.

+1

, вероятно, лучше отредактировать свой первый пост, а не добавлять к нему комментарии. –

+0

Спасибо, Андерс, я не понимал, что могу это сделать, я добавил редактирование. –

ответ

3

К сожалению, это выходит за рамки возможностей препроцессора C.

Вы считаете вместо этого что-то вроде m4?

+0

Спасибо, LnxPrgr3, мне нужно будет прочитать документы, чтобы узнать, совместим ли это с моими школьными компьютерами, но это то, о чем я мечтал какое-то время, думаю, ^^ –

+0

Lol, это уже установленный на моих школьных компьютерах^_^Большое вам спасибо: D –

7

Почему бы просто не создать файл заголовка, который сам #include s все другие файлы заголовков для библиотеки? Затем для каждой библиотеки вы просто включаете один мета-заголовок этой библиотеки.

1

В файле includes.h

#include "1.h" 
#include "2.h" 
#include "3.h" 

Во всех остальных файлах

#include "includes.h" 
1

#include директивы предварительной обработки будучи сам обрабатываются на той же стадии, что и макро оценки, это, скорее всего, не работа. Я не верю, что предварительная обработка может быть рекурсивной. (или итеративным, если на то пошло).

Вместо этого типичный способ это делается - это создать небольшой файл include, включающий все необходимые #includes. См. Ответ Кори Петского для иллюстрации.

Слово предостережения:
Хотя это может сократить сотни строки кода, вы должны учитывать, что эти «легкие» строк кода. Как правило, они перемещаются по ним, в отличие от строк кодов, связанных с истинной логикой программы.

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

Edit: Это только в ;-)
Кто-то только что задал этот вопрос SO Good idea to put all project headers into one file? и ответы, кажется, в целом согласны с моим взятием, что есть, как правило, немного усиления должна быть получена от группировки заголовков.

2

Чтобы решить проблему осветленный, вы могли бы просто реорганизовать initial_screen.state и login.state так, что они начинают с STATE() и заканчиваются END_STATE. Тогда вы можете просто сделать:

#include "initial_screen.state" 
#include "login.state" 

... что эквивалентно тому, что вы после этого - это просто #include вместо ADD_STATE.

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