导入功能使用其他名称

时间:2019-01-24 08:31:36

标签: c

在C语言中是否可以使用其他名称导入库函数?

最好说这种伪造的C语法:

 char *malloc(int) as mymalloc;

代替了库文件中已知的malloc,它变成了mymalloc。并且标识符malloc未声明,可用于以后的声明。

在某些特定的用例中,当以后可以选择包含第三方大型头文件时,我需要这样做,但是必须始终使用很少的功能。因此,我需要另一个微标头,该微标头定义与较大标头稍后声明(或不声明)相同的几个函数。这都是编译为C的编程语言的一部分,因此很奇怪的要求是,小标头必须在大标头文件之前定义函数。另外,我无法使用一些简单的ifdef解决方案,因为大标题不了解我,因此无法对其进行修改。有问题的函数将复杂的结构指针作为参数,但是我只是将它们声明为void*,因此编译器将发出“不兼容的重新定义”的信号。

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

并且CLUMSY_STRUCTUREs的定义长达一页,所以我不希望它们出现在我的小标题中。

即使在重新定义CLUMSY_STRUCTURE时,我也不确定在看到第二个声明时编译器是否会认为两个声明是兼容的。

1 个答案:

答案 0 :(得分:2)

是的,可以的!

您只需要构建一个包含适当头的小型包装器,并调用标准库函数,然后从所需位置调用该包装器即可。唯一的限制是名称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;
}

main中的malloc指针没有链接,因此它将在没有警告的情况下工作。如果它是一个全局变量,则应将其声明为静态变量以接收内部链接

但是要注意:重用标准库中的名称,这样每个标准都允许并被编译器接受,但是这会使以后的读者感到困惑,应尽可能避免使用。由于明确的要求,我在这里只是这样做。永远不要在 NORMAL 代码中这样做,至少不要假装我建议这样做!