Может ли предварительная директива #include быть отключена/исключена?

StackOverflow https://stackoverflow.com/questions/8309253

Вопрос

Например: если у меня есть два файла .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;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top