□ 標準ライブラリ関数は文法的にはユーザ記述の関数と同様の存在
用途的なことを言えば、たとえば、main,exit,longjmp,等特殊なものも
ありますし、printfやscanfなどの可変引数を持つ関数なども特殊といえますが、
文法(型チェック等の都合)からすれば、標準ライブラリ関数は独立した
存在で、他のユーザが記述した関数となんら違いはないです。
ユーザが書こうと思えば、コンパイラを改造せずとも、コンパイラに
付属する標準ライブラリの代わりを書いて交換することが可能なわけです。
void main()と書いたところで かってにOSに 0を返すようなことはしてくれませんし、
printfの書式指定の文字列を解釈して可変引数の型をチェックしてくれたりはしませんし、
mallocで得た領域のサイズをsizeofで求めることはできません。
ユーザの記述したものと、立場が同じです。標準ライブラリ関数だからといって
ユーザプログラムでは行えない特殊な処理やチェックをコンパイラが
行うというのは(標準機能では)ないです。
あと関数の把握でややこしくしている存在として#defineマクロがあるでしょうか。
assertマクロや stdarg.h のマクロは、関数表現だけど、関数では記述しようの
ない動作をするため、マクロということを意識しないと、何か特殊な文法のように
思えるかもしれません
(が、マクロはユーザが記述可能なものですし、型チェックと言う意味では
関数以上にゆるく無防備な存在でもあります)。
関数的な存在で、(唯一)ユーザがどないしようもないものとしては sizeof があります。
これは関数でなく実は演算子なんですが、結構、関数と勘違いしている人も多そうです
(あとreturnなんかも関数的表現する人もいますけど、さすがにその動作から制御文であって関数だと勘違いすることはないとは思いますが)。
sizeofやマクロのような存在のため、人によっては(他言語の経験者でC言語をはじめた場合など)何かよくわからないけどコンパイラが特殊な処理をする関数がある、と、思われている場合があるような気がします。
が、基本的にはユーザが記述できないようなことは標準関数でも出来ない、
という状態なわけです。
と、書きましたが処理系(コンパイラ)によっては、標準関数の場合特殊な処理を
するものもあります。といっても動作の変わらない範囲でインライン展開(関数呼び出し
じゃなくて、その場にその動作をするルーチンを生成)できるようにしたり、gccのように
printfの引数をチェックする機能を提供したりの類で、mallocした領域サイズをsizeofで
求められるというようなC言語として動作が違ってくるような改変はまずないです。
(とかいたけど他の要素ではgccにしろvcにしろc++builderにしろ色々文法的に拡張されたりして、便利だけど、互換性ということでは問題になる要素が結構あるような……)。