scanf関数がどのように実装されているか知りたいです。(もちろん楽しみのために)引数の数は可変であるためva_list、va_argマクロによって確実に実装されます。
また、引数の数がフォーマット文字列と一致しない場合、いくつかの警告がスローされます。これは、フォーマット文字列を解析し、それを引数の数と比較することで実行できます。魔法はありません。
どのように実装されているかわからないのは、型チェックだけです。引数の型(データへのポインタ)がフォーマットリテラルの対応する宣言と一致しない場合scanf、警告が生成されます。ポインタが指すデータの種類をどのように確認できますか?
例:
#include<stdio.h>
int main()
{
    char buffer1[32], buffer2[32];
    int n; 
    double x;
    scanf("%s %s %d",buffer1, buffer2, &x); // warning
    scanf("%s %s %d",buffer1, buffer2, &n); // ok
}
出力:
warning: format ‘%d’ expects argument of type ‘int *’,
but argument 4 has type ‘double *’ [-Wformat]
AFAIK CライブラリはC言語/コンパイラの一部ではないため、に言語関連のものはありません<stdio.h>。警告はscanf、コンパイラ[?]ではなく、の実装によって生成されると思います。(多分使用#warning)
あるコードで同様のことをしたい場合、ポインターが指しているデータ型をどのように知ることができますか?
注:GNU Cライブラリのソースコードをダウンロードして、を確認しましたscanf.c。非常に複雑なコードを見つけることができません。#ifndef奇妙な名前と構造を持つ他の関数へのsと呼び出しがたくさんあります...