C не поддерживает пространства имен, такие как C ++. Реализация пространств имен C ++ искажает имена. Подход, изложенный ниже, позволяет вам использовать преимущества пространств имен в C ++, имея имена, которые не искажены. Я понимаю, что суть вопроса в том, почему C не поддерживает пространства имен (и тривиальный ответ будет, что это не так, потому что он не реализован :)). Я просто подумал, что это может помочь кому-то увидеть, как я реализовал функциональность шаблонов и пространств имен.
Я написал учебник о том, как использовать преимущества пространств имен и / или шаблонов с помощью C.
Пространства имен и шаблоны в C
Пространства имен и шаблоны в C (с использованием связанных списков)
Для базового пространства имен можно просто использовать префикс имени пространства имен в качестве соглашения.
namespace MY_OBJECT {
struct HANDLE;
HANDLE *init();
void destroy(HANDLE * & h);
void do_something(HANDLE *h, ... );
}
можно записать как
struct MY_OBJECT_HANDLE;
struct MY_OBJECT_HANDLE *my_object_init();
void my_object_destroy( MY_OBJECT_HANDLE * & h );
void my_object_do_something(MY_OBJECT_HANDLE *h, ... );
Второй подход, который мне нужен, использующий концепцию пространства имен и шаблонов, заключается в использовании макроконкатенирования и включения. Например, я могу создать
template<T> T multiply<T>( T x, T y ) { return x*y }
с использованием файлов шаблонов следующим образом
множественно-template.h
_multiply_type_ _multiply_(multiply)( _multiply_type_ x, _multiply_type_ y);
множественно-template.c
_multiply_type_ _multiply_(multiply)( _multiply_type_ x, _multiply_type_ y) {
return x*y;
}
Теперь мы можем определить int_multiply следующим образом. В этом примере я создам файл int_multiply.h / .c.
int_multiply.h
#ifndef _INT_MULTIPLY_H
#define _INT_MULTIPLY_H
#ifdef _multiply_
#undef _multiply_
#endif
#define _multiply_(NAME) int ## _ ## NAME
#ifdef _multiply_type_
#undef _multiply_type_
#endif
#define _multiply_type_ int
#include "multiply-template.h"
#endif
int_multiply.c
#include "int_multiply.h"
#include "multiply-template.c"
В конце всего этого у вас будет файл функции и заголовка для.
int int_multiply( int x, int y ) { return x * y }
Я создал гораздо более подробное руководство по предоставленным ссылкам, которое показывает, как оно работает со связанными списками. Надеюсь, это кому-нибудь поможет!