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と呼び出しがたくさんあります...