Как включить / удалить функциональность кода C для разных целей / архитектур? - PullRequest
1 голос
/ 03 апреля 2019

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

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

Мне было интересно, есть ли согласованный способ сделать это в C, и как вы могли бы это сделать?

Я думаю, что я бы использовал #define INCLUDE_BOOT_FUNCTIONALITY, а затем внутри BootFunctionality.c я бы использовал #ifdef INCLUDE_BOOT_FUNCTIONALITY в верхней части, чтобы включить в него только код перед компиляцией, если он был определен. Затем я хотел бы перейти к каждому фрагменту кода, где используется BootFunctionality.c, и заключить его в команду препроцессора #ifdef.

Это приемлемый способ ведения дел или есть лучший?

Для контекста, мой код написан в модульной форме, где каждый модуль, например BootFunctionality.c, работает в своем собственном потоке и просто запускается в начале программы и вызывает функции, доступные в Main.c, для разговора. назад. Чтобы удалить его, все, что мне нужно сделать, это удалить, где он включен в Main.h и удалить строку в Main.c, которая запускает этот поток.

Ответы [ 2 ]

3 голосов
/ 03 апреля 2019

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

Имейте в виду, что компилятор очень помогает, определяя для вас набор констант, чтобы вы могли их использовать. Это , как вы можете найти то, что было определено. И здесь - документы. Более того, каждая библиотека может вводить свои собственные константы. Не стесняйтесь использовать их.

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

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

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

2 голосов
/ 03 апреля 2019

Сделайте это скорее наоборот: если platform1_header.h содержит функциональность, о которой идет речь, для платформы, в исходном файле должно быть:

#if defined PLATFORM1
#include "platform1_header.h"
#elif defined PLATFORM2
#include "platform2_header.h"
#endif

И добавьте подходящие источники в Makefile или любой другой сценарий сборки.

...