我对这段代码如何以及为什么会这样工作感到有些困惑。在我从事的任何项目中,我实际上都没有遇到过这种情况,我什至没有想过自己做。
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
主.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
定义,自定义函数被调用,如果它被注释掉,正常的库函数被调用,并且都按预期工作。
问题
什么是正确的术语?“覆盖”,“阴影”,还有别的吗?
这是特定于 gcc 的,还是 POSIX,或 ANSI C,甚至完全未定义?
如果函数是 ANSI C 函数或(如这里)POSIX 函数,它有什么区别吗?
覆盖函数在哪里被调用?
.o
至少通过同一链接中的其他文件,我认为.a
文件也添加到链接命令中。-l
使用链接器的命令行选项添加的静态或动态库怎么样?如果可能,如何从覆盖的 getline 调用库版本的 getline?