我对这段代码的工作方式和原因感到有些困惑.在我参与过的任何项目中,我都没有遇到过这种情况,我甚至都没想过会自己做.
override_getline.c:
#include <stdio.h>
#define OVERRIDE_GETLINE
#ifdef OVERRIDE_GETLINE
ssize_t getline(char **lineptr, size_t *n, FILE *stream)
{
printf("getline &lineptr=%p &n=%p &stream=%p\n", lineptr, n, stream);
return -1; // note: errno has undefined value
}
#endif
Run Code Online (Sandbox Code Playgroud)
main.c中:
#include <stdio.h>
int main()
{
char *buf = NULL;
size_t len = 0;
printf("Hello World! %zd\n", getline(&buf, &len, stdin));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
最后,示例编译并运行命令:
gcc main.c override_getline.c && ./a.out
Run Code Online (Sandbox Code Playgroud)
使用OVERRIDE_GETLINEdefine,调用自定义函数,如果注释掉,则调用普通库函数,并且两者都按预期工作.
这个的正确用语是什么?"覆盖","阴影",还有什么?
这是gcc特定的,或POSIX,还是ANSI C,甚至是未定义的?
如果函数是ANSI C函数或(如此处)POSIX函数,它会有什么不同吗?
调用覆盖函数在哪里?通过.o相同链接中的其他文件,至少,我也假设.a文件也添加到链接命令.如何使用-l链接器的命令行选项添加静态或动态库?
如果可能,如何从覆盖的getline调用getline的库版本?
我需要重新编写free()func用于教育目的,它也必须命名free().
当我重命名我的功能时,myfree()它完美地工作但是当我命名它时free(),程序不知道他是否需要使用我的或系统的所以程序Segmentation fault(core dumped)即使我不调用我的自由(只是声明另一个free()功能似乎崩溃了)
那我怎么能告诉编译器使用我的而不是系统?
提前谢谢你.
编辑:Linux操作系统