C 以其他名称导入函数

C 以其他名称导入函数,c,C,在C中,是否可以用不同的名称导入库函数 比如说这个假C语法: char *malloc(int) as mymalloc; 它不是库文件中已知的malloc,而是mymalloc。And和标识符malloc未声明,可用于将来的声明 当第三方大头文件可以在以后选择性地包含,但必须始终使用很少的函数时,我需要将其用于某些特定的用例。因此,我需要另一个微标题,它定义了与较大标题稍后声明(或不声明)相同的几个函数。这一切都是编译成C的编程语言的一部分,所以奇怪的要求是小头文件必须在大头文件之前定义函

在C中,是否可以用不同的名称导入库函数

比如说这个假C语法:

 char *malloc(int) as mymalloc;
它不是库文件中已知的
malloc
,而是
mymalloc
。And和标识符
malloc
未声明,可用于将来的声明

当第三方大头文件可以在以后选择性地包含,但必须始终使用很少的函数时,我需要将其用于某些特定的用例。因此,我需要另一个微标题,它定义了与较大标题稍后声明(或不声明)相同的几个函数。这一切都是编译成C的编程语言的一部分,所以奇怪的要求是小头文件必须在大头文件之前定义函数。此外,我不能使用一些琐碎的
ifdef
解决方案,因为大标题不了解我,我无法修改它。所讨论的函数以一个复杂的结构指针作为参数,但我只是将它们声明为正在讲话的
void*
,因此编译器会对“不兼容的重新定义”发出吠声

笨拙的_结构的定义很长,我不希望它们出现在我的小标题中

此外,我也不确定,即使我重新定义了笨拙的结构,当编译器看到第二个声明时,它是否会认为这两个声明是兼容的。

是的,你可以

您只需要构建一个包含适当的头并调用标准库函数的小包装器,然后在需要的地方调用该包装器。唯一的限制是名称malloc不能接收外部链接,因为if在链接时会与标准库标识符冲突

下面是一个代码示例:

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);
}
#包括
#包括“mymalloc.h”
void*mymalloc(整数大小){
返回malloc(大小);
}
void myfree(void*pt){
免费(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;
}
#包括
#包括
#包括“mymalloc.h”
int main(){
char*malloc=mymalloc(64);
strcpy(malloc,“foo-bar”);
printf(“%s\n”,malloc);
myfree(malloc);
返回0;
}
main中的
malloc
指针没有链接,因此它将在没有警告的情况下工作。如果它是一个全局变量,则应将其声明为静态以接收内部链接


但是要注意:按照标准,以这种方式重用标准库中的名称是允许的,并且编译器也接受这种方式,但是这会使将来的读者感到困惑,如果可能的话,应该避免使用。我在这里做这件事只是因为有明确的要求。在普通代码中永远不要这样做,至少永远不要假装我建议这样做

您是否可以编写自己的函数,只需调用另一个函数即可?如果您在“大头文件”中获取声明的子集并将其保存为“小头文件”,则“小头文件”可以安全地包含在“大头文件”之前。所以我不确定我是否理解这个问题。你能创建一个例子来说明你的问题吗?不,你不能…像
#include“LargeHeader”
这样的东西有什么问题吗?必须提到@sanderedycker:OP没有标记Linux,LD#u PRELOAD是不可移植的。如果我们这样做,我们应该谈论gcc弱符号,它将明确允许重写库符号。@Sanderedycker:没问题,这就是为什么我在自己的评论中提到gcc弱符号。但我不确定这是否真的需要在答案中。无论如何,谢谢你的评论。
#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;
}