Включить файл C, который находится в той же папке, что и основной файл C - PullRequest
0 голосов
/ 15 января 2019

У меня есть папка, которая содержит 3 файла:

  • main.c
  • file1.c
  • file2.c

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

в main.c, я добавил следующие строки:

#ifdef MY_SYMBOL
 #include "file1.c"
#else
 #include "file2.c"
#endif

Проблема, которую я обнаружил, заключается в том, что когда определено MY_SYMBOL , file1.c компилируется дважды, поскольку в make-файле упоминается, что он компилирует все исходные файлы в каждой папке.

Ограничение - я не должен изменять make-файл! Поэтому, чтобы избежать этого, я изменил расширение file1.c и file2.c на file1.h и file2.h соответственно , сохранив их содержимое (определение всех частных функций), и я обновил содержимое main.c следующим образом:

#ifdef MY_SYMBOL
 #include "file1.h"
#else
 #include "file2.h"
#endif

Принимая во внимание вышеупомянутое ограничение, является ли последнее предложение лучшим способом?

Обратите внимание, что file1.c и file2.c содержат те же функции, но с различной реализацией.

1 Ответ

0 голосов
/ 15 января 2019

Среди прочего, программисты C обычно не ожидают одного из следующих действий:

  1. .h-файлы, содержащие реализации функций или определения переменных
  2. .c-файлов, которые включены.

Так что я бы сказал, что обоими способами вы как-то "удивите" других.

Если вы не должны изменять makefile (кстати: почему?), Вы можете инкапсулировать варианты реализации в ваших .c -файлах в директивах препроцессора:

// file1.c  (OR: file_mysym_implementation.c):
#ifdef MY_SYMBOL
   // code goes here
#endif

// file2.c  (OR: file_non_mysym_implementation.c):
#ifndef MY_SYMBOL
   // code goes here
#endif

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

...