No.4ベストアンサー
- 回答日時:
ごくおおざっぱに言えば、インクルードファイルの中には、
・グローバル変数
・typedef による型の定義
・sturcut や union や enum などユーザー定義の型(の定義)
・#define によるマクロ
・関数プロトタイプ
があります(その他のものもあります)
この中で、関数プロトタイプをのぞけば必須です。
ですから、NULL や EOF を使うには、(別に定義するのでなければ) stdio.h が必要です(だったかな?)
assert の実体は(関数ではなくて) #define によるマクロだった気がします(未確認・だとしたらインクルードは必須ですね)
さて、printf() の件ですが、これは、
printf("SWSW\n");
だったから(2番目以降の引数がないから)たまたま実行可能だったという可能性があります。
printf() は、可変引数(引数の数が決まっていない)関数なので、プロトタイプがないと、うまく処理できないコンパイラが多いです。
その場合でも、最初の引数の型決まっているので、引数がひとつだと、たまたま正常に実行可能です。
printf("%d, %f, %s", 1, 0.1, "STR");
なんかだとうまく処理できますでしょうか?
(これも未確認)
あと、関数の返値の型が int でないものは、プロトタイプがないと変な値が帰ってきます。
(ちなみに、printf() の返値は int です。あまり使われませんが)
No.8
- 回答日時:
先ほど、リナックスの参考書を見てみると、print()関数は、内部でシステムコールを使っているとありました。
カーネルと結びつけられているからでは、ないでしょうか?
No.7
- 回答日時:
> ”可変個引数を持つ関数を関数原型なしで呼び出した場合の動作は未定義”というのはどこで規定されているものなのでしょうか(C90?)。
JIS X3010:2003の「6.5.2.2 関数呼出し」の項には、
「呼び出される関数を表す式が,関数原型を含まない型をもつ場合,各実引数に対して整数拡張を行い,型floatをもつ実引数は型doubleに拡張する。この操作を既定の実引数拡張(default argument promotion)と呼ぶ。実引数の個数と仮引数の個数が等しくない場合,その動作は未定義とする。関数原型を含む型で関数を定義し,かつ,関数原型が省略(, ...)で終わっている場合,又は拡張後の実引数の型が,仮引数の型と適合しない場合,その動作は未定義である。」
という記述があります。
No.6
- 回答日時:
Cでは、関数原型(プロトタイプ)が宣言されていない状態でも関数を呼び出すことができます。
しかし、printfのような可変個引数を持つ関数を関数原型なしで呼び出した場合の動作は未定義です。動作が未定義の場合、特定の振る舞いをするように処理系を実装しても構わないので、GCCではまともに実行できるというだけです。assertは、既に回答が出ているようにマクロですので、<assert.h>を必ずインクルードしなければなりません。
ありがとうございます。
assertについてはマクロ実装との事で理解しました。
”可変個引数を持つ関数を関数原型なしで呼び出した場合の動作は未定義”というのはどこで規定されているものなのでしょうか(C90?)。
No.5
- 回答日時:
既に書かれているように, assert は assert.h で定義されるマクロです (というか, assert の機能をマクロ以
外で実現する方法が存在しない)... と規格に書いてある. だから, assert.h を #include しないと使えません.No.2
- 回答日時:
1つは C ではプロトタイプ宣言が必須ではないこと, もう 1つは勝手に (printf などの実体の入っている) libc をリンクするから, かな.
ちなみにプロトタイプ宣言がない関数を呼び出した場合, 型 int()(...) をもつと仮定されるんじゃなかったかな.
回答ありがとうございます。
プロトタイプ関数が必須でない事、libcに含まれているという事で理解しましたが、
assert関数は<assert.h>をincludeしないとコンパイルエラーになるのですが、この差分は何になるのかご存知でしょうか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
勝率をプログラムに
-
cshの文字列操作(0埋め)
-
コンパイルエラーについて
-
switch分のケースを範囲数?に...
-
4の倍数を論理演算で表す。。
-
printfの出力内の文字をdefine...
-
三角形の判別
-
正の実数Aを求めよまた、関数...
-
インクリメント、デクリメント。
-
10個出力で改行したいのですが...
-
C言語でマウス入力(クリックや...
-
教えてください!!
-
ビットを操作する。
-
円の面積を求めるプログラミン...
-
%P と %X の違い
-
C言語のソースをC++言語に変換...
-
C言語習いはじめです
-
3つの整数が等しいかどうか調...
-
間違いを指摘して頂けませんか...
-
筆算(加法)について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
コンパイルエラーについて
-
printf で二進表示を行いたい。
-
c言語でAからZまでを表示する...
-
テキストカーソル位置の取得
-
4の倍数を論理演算で表す。。
-
cshの文字列操作(0埋め)
-
【C言語教えてください】sin波...
-
10個出力で改行したいのですが...
-
wsprintfの書式制御文字列につ...
-
error C2143: 構文エラー : ';'...
-
printfの出力内の文字をdefine...
-
%P と %X の違い
-
C言語
-
strcmp
-
(C言語)めちゃくちゃな値にな...
-
コマンドラインに出力した文字...
-
スレッドとメッセージキューに...
-
printf( " %2d", p * q );
-
Visual Sutdio 2017 でのC言語...
-
defineで定数が置き換えられな...
おすすめ情報