Одной из больших проблем си является отсутствие пространств имён или системы модулей. Если есть две библиотеки, в которых функции имеют одинаковые имена, то произойдёт коллизия: нельзя будет понять, какая из функций будет использована. Компоновщик выдаст ошибку, что функция определена более одного раза.
К примеру в нашем проекте есть два подключаемых файла
и соответствующий ему .с файл
И файл
и соответствующий ему файл
Если мы попытаемся подключить оба заголовочных файла, то получим ошибку: обнаружен многократно определенный символ - один или более.
Избавиться от неё можно (возможно, ещё есть другие способы...) объявив функции func статическими.
Теперь проект скомпилируется, только вот использовать эти функции в main не удастся. Для того, чтобы использовать их, создадим структуру.
Для файла
для файла
Функции (getFileNamespace, getFile2Namespace) возвращают структуру, у которой поле - указатель на функцию - равно нашей статической функции.
Теперь в main можно создать экземпляр структуры File или File2 и через поле структуры обратиться к статической функции.
К примеру в нашем проекте есть два подключаемых файла
File.h
C:
int func(int a, int b);
и соответствующий ему .с файл
File.c
C:
#include "File.h"
int func(int a, int b)
{
return a + b; // сумма параметров
}
И файл
File2.h
C:
int func(int a, int b);
и соответствующий ему файл
File2.c
C:
#include "File2.h"
int func(int a, int b)
{
return a * b; // обратите внимение, здесь в теле функции умножение параметров
}
Если мы попытаемся подключить оба заголовочных файла, то получим ошибку: обнаружен многократно определенный символ - один или более.
C:
#include "File.h"
#include "File2.h"
void main()
{
return 0;
}
Избавиться от неё можно (возможно, ещё есть другие способы...) объявив функции func статическими.
C:
static int func(int a, int b);
Теперь проект скомпилируется, только вот использовать эти функции в main не удастся. Для того, чтобы использовать их, создадим структуру.
Для файла
File.h
C:
#include <stdlib.h>
typedef struct File
{
int (*func)(int a, int b);
} File;
static int func(int a, int b);
File* getFileNamespace();
для файла
File2.h
C:
#include <stdlib.h>
typedef struct File2 {
int (*func)(int a, int b);
} File2;
static int func(int a, int b);
File2* getFile2Namespace();
Функции (getFileNamespace, getFile2Namespace) возвращают структуру, у которой поле - указатель на функцию - равно нашей статической функции.
File.c
C:
#include "File.h"
int func(int a, int b)
{
return a + b;
}
File* getFileNamespace()
{
File* temp = (File*)malloc(sizeof(File));
temp->func = func;
return temp;
}
File2.c
C:
#include "File2.h"
int func(int a, int b)
{
return a * b;
}
File2* getFile2Namespace()
{
File2* temp = (File2*)malloc(sizeof(File2));
temp->func = func;
return temp;
}
Теперь в main можно создать экземпляр структуры File или File2 и через поле структуры обратиться к статической функции.
C:
#include <conio.h>
#include <stdio.h>
#include "File.h"
#include "File2.h"
void main()
{
int a;
int b;
File* namespaceFirst = getFileNamespace();
File2* namespaceSecond = getFile2Namespace();
a = 10;
b = 20;
printf("using namespace first = %d\n", namespaceFirst->func(a, b));
printf("using namespace second = %d\n", namespaceSecond->func(a, b));
free(namespaceFirst);
free(namespaceSecond);
_getch();
}