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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングペーパーテスト 次の問題の実行結果を答えろ #include int x[ ] = { 1 2022/06/16 21:49
- C言語・C++・C# プログラミングの授業のペーパーテスト 実行結果を答えろ #include int x[ ] = {1 3 2022/06/16 20:08
- C言語・C++・C# C言語のマクローリン展開ローラン展開のコードについて 3 2022/12/15 14:45
- C言語・C++・C# アセンブラ指令 3 2023/06/17 14:47
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# プログラミングのペーパーテスト 実行結果がどのように表示されるか答えよ #include <stdi 1 2022/07/09 14:27
- C言語・C++・C# プログラミングのペーパーテスト 実行結果を表示せよ #include <stdio.h> int h 1 2022/07/09 15:27
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分 1 2022/07/19 17:03
- C言語・C++・C# 至急教えてください!プログラミングの問題です。 割られる整数と割る整数を受け取って、商と余りを出力す 3 2022/07/05 10:23
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語での、年複利の計算方法...
-
C言語の勉強しています。すみま...
-
printf で二進表示を行いたい。
-
8人分のテストの点数を入力し、...
-
プログラム(C言語)
-
コーディング
-
【C言語教えてください】sin波...
-
C言語 プログラミング
-
switch分のケースを範囲数?に...
-
台形の面積を求めるプログラム
-
ブラックジャック
-
三角形の判別
-
10進数を2進数に変換するには・...
-
覆面算 C
-
改行について 1行に何個かづ...
-
困ってます!Cプログラミングに...
-
srand(time(NULL))の使い方
-
パスカルの三角形についてのCプ...
-
printfの変換仕様について
-
LU分解法のピボッティングにつ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
10個出力で改行したいのですが...
-
printf で二進表示を行いたい。
-
【C言語教えてください】sin波...
-
strcmp
-
コンパイルエラーについて
-
c言語でAからZまでを表示する...
-
コマンドラインに出力した文字...
-
cshの文字列操作(0埋め)
-
4の倍数を論理演算で表す。。
-
C言語 プログラミング
-
8人分のテストの点数を入力し、...
-
%P と %X の違い
-
C言語での、年複利の計算方法...
-
printf( " %2d", p * q );
-
hit&bolwのプログラミングがで...
-
scanfに文字が入力されたときに...
-
error C2143: 構文エラー : ';'...
-
printfの出力内の文字をdefine...
-
テキストカーソル位置の取得
-
unsigned int型について
おすすめ情報