В последнее время я видел интересный способ реализовать аналог явного именования в C. Это достигается с помощью struct
для хранения const
указателей на функции, например:Compiler обработка функции STRUCT указателей
Foo .h:
extern const struct foo_namespace {
void (* const bar)(int a, int b);
int (* const baz)();
char *(* const qux)(const char *str);
} Foo;
foo.c:
#include "foo.h"
const struct foo_namespace Foo = {
.bar = /* some function */,
.baz = ... ,
.qux = ...
};
Это позволяет вызывать функции, как Foo.bar()
, s аналогично C++ Foo::bar()
. Я думал об этой технике и хотел ее использовать, но думал о некоторых проблемах.
Является ли компилятор, вероятно, встроить всю структуру таким образом, чтобы вызовы через указатели функций заменялись самими функциями? Кажется маловероятным, поскольку
const
фактически не объявляет константу времени компиляции. Это также сделало бы невозможным встроенные функции, связанные с именами.В какой исполняемой секции это может храниться? Кажется возможным, что это может быть проблемой безопасности, если возможно скрыть структуру и установить различные указатели на функции.
Это сильно отличается от пространств имен. Это время выполнения, а пространства имен - время компиляции. В адресе рассматриваются разные вопросы. – Olaf
@Olaf Вот почему я назвал его аналогом, и почему меня интересует способность компилятора выполнять на нем оптимизацию. –
Аналог подразумевает аналогичную семантику для решения аналогичной проблемы. Это не то, что делают две функции. Указатель функции в 'struct' - это более подход OOP в C, чем эмуляция пространств имен. Для пространств имен просто используйте префикс или макрос для создания имен из имени модуля плюс имя функции. – Olaf