このコードがどのように、そしてなぜこのように機能するのか、私は少し困惑しています。私が取り組んだどのプロジェクトでも実際にこれに遭遇したことはなく、自分でやろうとさえ考えていませんでした.
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 なのか、それともまったく未定義なのか?
function が ANSI C 関数であるか、(ここのように) POSIX 関数であるかに違いはありますか?
オーバーライド関数はどこで呼び出されますか?
.o
少なくとも、同じリンク内の他のファイルによって、.a
リンクコマンドに追加されたファイルも推定されます。-l
リンカーのコマンドラインオプションで追加された静的または動的ライブラリはどうですか?可能であれば、オーバーライドされた getline から getline のライブラリ バージョンを呼び出すにはどうすればよいですか?