Может ли предварительная директива #include быть отключена/исключена?
-
25-10-2019 - |
Вопрос
Например: если у меня есть два файла .h
Process1.h и Process2.h
и они содержат две функции с разными выходными переменными.
Process1.h:
function(int var)
{
return 2*var;
}
Process2.h:
function(int var)
{
return 10*var;
}
Можно ли это сделать в Main.c:
int main()
{
int a = 2;
#include "process1.h"
printf("%d",function(a)); //output is 4
EXCLUDE #INCLUDE "process1.h" ????? <----can this be done in any way??
#include "process2.h"
printf("%d",function(a)); //output is 20
}
Решение
Нет, вы не можете «не включать» файл. Подумайте обо всех директивах препроцессора (строки, начинающиеся с #
) как происходит до Фактический компилятор C даже видит исходный файл. Они просто работают в тексте файла, и препроцессор может быть реализован как отдельный шаг, который просто подает новый текст в фактический компилятор.
Лучший способ изменить действия include
В зависимости от вызывающего абонента использовать дополнительные макросы внутри включенных файлов, которые вы можете #define
прежде чем включать их.
Тем не менее, ваш общий синтаксис выключен, вы не можете (обычно) функции гнезда в C.
Другие советы
Нет, и вы не должны пытаться написать программу с двумя функциями с тем же именем.
В особом случае, что функции фактически определены в файле заголовка (вместо просто прототипов), вы Можно сделай это:
#define function function_file1
#include "file1.h"
#undef function
#define function function_file2
#include "file2.h"
#undef function
int
main (void)
{
int a = 2;
printf ("%d\n", function_file1 (a));
printf ("%d\n", function_file2 (a));
}
НО Если вы переименуете прототип функции, то вы на самом деле не переименовали реальную функцию, поэтому вы получите неопределенную ошибку символа при ссылке.
В любом случае, если у вас есть две функции, определенные с тем же именем, то это все равно не будет ссылаться, не важно, что еще вы делаете в источниках. (В C ++ иногда можно определить две вещи с одним и тем же именем, но однократное правило означает, что линкера разрешается предположить, что они оба одинаковы и просто выбирают его.)
Вот почему библиотеки должны использовать имена, которые не будут использоваться в другом месте - обычно путем добавления общего префикса ко всем именам символов (например, my_unique_lib_initialize()
).
Почему бы не использовать массив указателей функций. Конечно, вам нужно инициализировать его в начале, но я думаю, что это, вероятно, решает то, что вы хотите сделать.
int process1_function(int var);
int process2_function(int var);
int main(void)
{
int i, a = 10;
int (* functions[2])(int);
functions[0] = process1_function;
functions[1] = process2_function;
for(i=0; i < 2; i++)
{
printf("%d", (functions[i])(a));
}
return 0;
}
Если вам не нужно динамически изменять, какую функцию вы позвоните, вы также можете просто префикс функций:
int process1_function(int var);
int process2_function(int var);
int main(void)
{
printf("%d",process1_function(a));
printf("%d",process2_function(a));
return 0;
}