Включить файл C, который находится в той же папке, что и основной файл c.

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

  • main.c
  • файл1.с
  • файл2.с

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

в 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< /strong> соответственно, сохранив их содержимое (определение всех приватных функций), и я обновил содержимое main.c следующим образом:

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

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

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


person Stack Over    schedule 15.01.2019    source источник
comment
Как правило, вы не должны включать исходные модули в другие исходные модули, для чего нужны заголовки, вы можете использовать препроцессор в вашем make-файле для дополнительной компиляции исходного файла.   -  person SPlatten    schedule 15.01.2019
comment
@SPlatten Ограничение в том, что я не должен изменять make-файл.   -  person Stack Over    schedule 15.01.2019
comment
Затем вы должны принять удар по размеру файла, так как оба исходных модуля будут скомпилированы и связаны с исполняемым файлом. Единственный вариант для вас - убедиться, что все в исходных модулях статично или имеет разные имена, а затем использовать заголовки, чтобы указать разные имена для каждого.   -  person SPlatten    schedule 15.01.2019
comment
сохраняя первую или вторую версию main.c?   -  person Stack Over    schedule 15.01.2019
comment
Вам нужно будет иметь отдельные заголовки, как во второй версии, а затем использовать разные прототипы в заголовках для ссылки на каждый исходный модуль. Вы можете использовать префикс для каждого и использовать определение препроцессора в качестве префикса функции.   -  person SPlatten    schedule 15.01.2019


Ответы (1)


Среди прочего, программисты на 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

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

person Stephan Lechner    schedule 15.01.2019