2015-03-06 4 views
0

Так что я хочу зафиксировать грех включения исходных файлов в исходные файлы.Включая исходный файл

По существу я создаю универсальный файл main.c, он станет базой для любого проекта, который я создаю на этой платформе.

Проект для проекции единственной реальной разницы в моем файле main.c находится в самой главной функции.

Что я хочу сделать, это создать другой файл projectloop.c и включить этот файл вместо основной функции. Имея это поведение как вставка текста.

//main.c: 
#include "main.h" 
...// includes 
...// standard functions 

int main(void) { 
    ...// standard configuration 

    #include "projectloop.c" 
} 

Однако я не уверен, что могу поместить в файл projectloop.c, чтобы его можно было скомпилировать.

Я хотел бы, чтобы это было так просто, как

//projectloop.c: 
while(1) { 
    // do my project loop 
    ledOn(); 
    delay(); 
    ledOff(); 
    delay(); 
} 

Это не будет строить, хотя.

Я получаю сообщение об ошибке в первой строке projectloop.c «Ожидаемая декларация».

У меня есть два вопроса.

  1. Могу ли я сделать прямое вложение текста с помощью способа, которым я пытаюсь это сделать?
  2. Есть ли веская причина не структурировать мой код таким образом?

Я не работал с #include исходными файлами напрямую, у меня создалось впечатление, что он просто заменит оператор #include содержимым файла.


Обновление: ранее не упоминалось, что я пытался сделать это в среде Eclipse.

Когда я использовал команду «build» Eclipse, файл projectloop.c строился на своем собственном.

не

Щелчок правой кнопкой мыши на projectloop.c в проекте исследователя Eclipse, я был в состоянии выбрать «Исключить из Строить»

+2

Ну, если компилятор по-прежнему пытается построить projectloop.c как автономный блок компиляции, возможно, он не работает на работу. – tux3

+0

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

+3

Если вы включили projectloop.c в main(), то не компилируйте projectloop.c как отдельный файл. Есть ли какая-то причина, по которой вы не можете просто вызвать главный вызов, например функцию mainLoop(); 'и определить эту функцию где-то еще? – JS1

ответ

0

Насколько я знаю (или вспомнить), стандартный C имеет не функцию, чтобы сделать .c или .h файл шаблона, так как это то, что вам нужно, template.c файл, который может генерировать несколько разных источников в зависимости от параметров.

Возможно, использование специального скрипта (даже bash script using sed) будет лучшим вариантом.

Например.

main.c.tpl файл

//main.c: 
#include "main.h" 
...// includes 
...// standard functions 

int main(void) { 
    ...// standard configuration 

    %%MAIN_CODE%% 
} 

Затем используйте скрипт для чтения main.c.TPL файл и заменить %% %% MAIN_CODE тег с любым текстом или исходным кодом из другого файла (или любой другой) и сбрасывать выход в реальный main.c файла для текущего проекта, который будет фактически составленный

+0

Препроцессор может сделать это и включить файл, указанный как '-DFILENAME = имя_файла' в командной строке. Это немного громоздко, но возможно. Но ** не рекомендуется **. – chqrlie

+0

@chqrlie, да, конечно, но как вы можете указать CPP добавить содержимое файла в определенное место в коде? i; m not sure –

+0

@chqrlie, возможно, используя макрос препроцессора вместо %% MAIN_CODE %% в моем примере, хм, да, это сработает, если макрос MAIN_CODE во включенном файле передается как параметр. Тем не менее, насколько я помню макросы CPP ** не могут ** охватывать более одной строки кода, поэтому он будет ограниченным –

0

Я никогда не видел, чтобы это делалось именно так.

Обычно люди проходят int argc, char* argv[] от основного, в свой собственный модуль кода, где происходит всякая магия.

#include "myModule.h" 

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

    myModule(argc, argv);  

    return 0; 
}