Я немного озадачен тем, как и почему этот код работает так, как он. Я на самом деле не сталкивался с этим в любом проекте, над которым я работал, и я даже не думал о том, чтобы сделать это сам.
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
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
пользовательская функция вызывается, и если она закомментирована, вызывается функция нормальной библиотеки, и обе работают как ожидалось.
Вопросы
-
Каков правильный термин для этого? "Переопределение", "затенение", что-то еще?
-
Является ли это gcc-специфическим, или POSIX, или ANSI C, или даже undefined во всех?
-
Не имеет значения, является ли функция ANSI C или (как здесь) функцией POSIX?
-
Где вызывается функция переопределения? Другими
.o
файлами в той же ссылке, по крайней мере, и я предполагаю, что.a
файлы добавлены в ссылку. Как насчет статических или динамических библиотек, добавленных с помощью опции-l
командной строки компоновщика? -
Если это возможно, как мне вызвать библиотечную версию getline из overriden getline?