Есть ли способ определить функцию с реализацией с другим именем? - PullRequest
1 голос
/ 01 апреля 2020

У меня есть функция в заголовке, которую нужно реализовать, чтобы остальная часть кода работала. Обычно я реализую эту функцию в main.c после включения заголовка, а компоновщик очистит все остальное.

Например, допустим, эта функция void foo(bool); в foo.h

Если У меня есть другая функция, реализованная как часть некоторого другого кода, которая точно соответствует задаче, скажем, void bar(bool);, реализованная в некоторых bar.h и bar.c

Я бы обычно go о связывании этих двух посредством включая bar.h и выполнение

void foo(bool var) {
    bar(var);
}

Если их много, то в основном это просто множество однострочных функций, чтобы сообщить функции о вызове другой.

Есть ли другой способ выполнить sh это?

1 Ответ

1 голос
/ 01 апреля 2020
void foo(bool var) {
    bar(var);
}

Либо функция глобальная, либо нет. Вы должны принять решение; вы не можете иметь и то и другое.

Если это просто оболочка в заголовке, тогда вы можете сделать это stati c inline:

// bar.h
static inline void foo (bool var)
{
    bar (var);
}

Должно быть ясно, что вы не можете использовать это вместе с различными определениями / объявлениями в foo.h.

Если вы просто хотите, чтобы функция, которая вызывается как foo, использовала bar в качестве имени сборки, то вы можете использовать следующее C -extension из GNU - C:

// bar.h
void foo (bool) __asm ("bar");

Это означает, что bar будет именем сборки foo. Это может избежать дополнительного шага вызова. Конечно, это также нельзя использовать с конфликтующим определением / объявлением foo. Также обратите внимание, что вам может потребоваться изменить имя сборки, например, платформы i386 обычно используют начальный _ (подчеркивание), чтобы вам пришлось использовать имя сборки _bar. А для C ++ вам понадобится искаженное имя.

Итог: В каждом модуле компиляции (модуле) вы должны решить, какую реализацию foo вы хотите использовать, и в зависимости от для этого включите либо foo.h, либо конфликтующий bar.h.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...