Может ли директива препроцессора #include быть отключена / исключена? - PullRequest
2 голосов
/ 29 ноября 2011

Например: если у меня есть два файла .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

}

Ответы [ 3 ]

6 голосов
/ 29 ноября 2011

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

Лучший способ изменить действия include в зависимости от вызывающего абонента - это использовать дополнительные макросы внутри включенных файлов, которые вы можете #define перед их включением.

Тем не менее, ваш общий синтаксис отключен, вы не можете (обычно) вкладывать функции в C.

3 голосов
/ 29 ноября 2011

Нет, и вам не следует пытаться написать программу с двумя функциями с одинаковым именем.

В особом случае, когда функции фактически определены в заголовочном файле (а не только в прототипах), вы может сделать это:

#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 ++ иногда можно определить две вещи с одинаковыми именами, но One-Definition-Rule означает, что компоновщик может предположить, что они на самом деле являются одной и той же вещью, и просто выбрать одну.)

Вот почему библиотеки должны использовать имена, которые не будут использоваться в других местах - обычно путем добавления общего префикса ко всем именам символов (например, my_unique_lib_initialize()).

0 голосов
/ 29 ноября 2011

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

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;
}
...