

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を探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
構造体メンバの個数
-
コンパイルエラーについて
-
アドレスの比較について
-
getchar()マクロによる空白文字...
-
三角形の判別
-
3つの入力した数値の大小比較...
-
C++でfprintfやprintf,fopenな...
-
8人分のテストの点数を入力し、...
-
wsprintf関数(書式制御文字列...
-
LU分解法のピボット選択機能実...
-
c言語で2000年以降カレンダーを...
-
C言語に関して質問です。 次の...
-
%P と %X の違い
-
既約分数の表示プログラム
-
10個出力で改行したいのですが...
-
boolean型の戻り値は可能か
-
C言語 繰り返しの問題
-
Visual Sutdio 2017 でのC言語...
-
文字と数字の判定について
-
数当てゲームを作っているのですが
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
10個出力で改行したいのですが...
-
c言語でAからZまでを表示する...
-
(C言語)めちゃくちゃな値にな...
-
コマンドラインに出力した文字...
-
コンパイルエラーについて
-
コマンドプロンプトがすぐ消える
-
勝率をプログラムに
-
テキストカーソル位置の取得
-
三角形の判別
-
【C言語教えてください】sin波...
-
4の倍数を論理演算で表す。。
-
C言語で、「自然数nを入力し、n...
-
入力したお金の金額からお札の...
-
cshの文字列操作(0埋め)
-
switch分のケースを範囲数?に...
-
scanfに文字が入力されたときに...
-
プログラミングについての質問です
-
unsigned int型について
-
ダブルポインタで2次元配列を作成
-
円の面積を求めるプログラミン...
おすすめ情報