Импорт функции под другим именем - PullRequest
0 голосов
/ 24 января 2019

Возможно ли в C импортировать библиотечную функцию под другим именем?

как сказать, в идеале этот поддельный синтаксис C:

 char *malloc(int) as mymalloc;

вместо malloc, как известно в файле библиотеки, оно становится mymalloc. И и идентификатор malloc не объявлен и доступен для будущих объявлений.

Мне это нужно для некоторого конкретного случая использования, когда сторонний файл большого заголовка может быть дополнительно включен позже, но всегда нужно использовать несколько функций. Поэтому мне нужен еще один микро-заголовок, который определяет те же самые несколько функций, которые больший заголовок объявляет (или нет) позже. Все это является частью языка программирования, который компилируется в C, поэтому странным требованием является то, что маленький заголовок должен определять функции перед большим файлом заголовка. Также я не могу использовать некоторые тривиальные решения ifdef, потому что большой заголовок не знает обо мне, и я не могу изменить его. Рассматриваемые функции принимают указатель сложной структуры в качестве параметра, но я просто объявляю их как говорящие void*, поэтому компилятор будет лаять при «несовместимом переопределении».

CLUMSY_STRUCTURE *create_struct();
do_something(CLUMSY_STRUCTURE *);

и определение CLUMSY_STRUCTURE - это страницы длиной, и я не хочу, чтобы они были в моем крошечном заголовке.

Также я не уверен, что даже если я переопределю CLUMSY_STRUCTURE, будет ли компилятор считать, что два объявления совместимы, когда он видит второе объявление.

1 Ответ

0 голосов
/ 24 января 2019

Да, вы можете!

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

Вот пример кода:

mymalloc.h

void * mymalloc(int size);
void myfree(void * pt);

mymalloc.c

#include <stdlib.h>
#include "mymalloc.h"

void *mymalloc(int size) {
    return malloc(size);
}

void myfree(void *pt) {
    free(pt);
}

main.c

#include <stdio.h>
#include <string.h>
#include "mymalloc.h"

int main() {
        char *malloc = mymalloc(64);
        strcpy(malloc, "foo bar");
        printf("%s\n", malloc);
        myfree(malloc);
        return 0;
}

Указатель malloc в main не имеет связи, поэтому он будет работать без предупреждения.Если это глобальная переменная, она должна быть объявлена ​​статической для получения внутренней связи

Но будьте осторожны: повторное использование имени из стандартной библиотеки таким образом разрешено для каждого стандарта и принимается компилятором, но это может сбить с толку будущих читателейи следует избегать, если это возможно.Я только сделал это здесь из-за явного требования.НИКОГДА НЕ ДЕЛАЙТЕ ЭТОГО В НОРМАЛЬНОМ КОДЕКЕ, и, по крайней мере, никогда не делайте вид, что я посоветовал это!

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