我对此代码的工作方式和原因感到困惑。在我从事的任何项目中,我实际上都没有遇到过,甚至我自己也没有想到过。
overlay_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
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;
}
最后,示例编译并运行命令:
gcc main.c override_getline.c && ./a.out
使用OVERRIDE_GETLINE
define时,将调用自定义函数,如果将其注释掉,则将调用普通库函数,并且两者均按预期工作。
正确的术语是什么?“覆盖”,“阴影”,还有其他东西吗?
这是特定于gcc的,还是POSIX或ANSI C,甚至是完全未定义的?
如果函数是ANSI C函数或POSIX函数(如此处),有什么区别吗?
覆盖函数在哪里调用?.o
至少由同一链接中的其他文件,并且我也假定.a
文件也添加到链接命令中。如何-l
通过链接器的命令行选项添加静态或动态库?
如果可能,如何从覆盖的getline调用getline的库版本?
链接器在库中搜索之前,将首先在命令行上搜索您提供的文件中的符号。这意味着,一旦看到getline
已定义的内容,它将不再寻找其他getline
符号。这就是链接器在所有平台上的工作方式。
当然,这对您的第五点有影响getline
,因为从链接器的角度来看,您的功能是原始功能,因此无法调用“原始”功能。
对于第五点,您可能想看看例如这个旧答案。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句