なぜgccは、引数なしと定義された関数に引数を渡すことができるのですか?
2023-10-07 12:05:37
疑問点
なぜこのコードがコンパイルされるのか理解できません。
#include <stdio.h>
void foo() {
printf("Hello\n");
}
int main() {
const char *str = "bar";
foo(str);
return 0;
}
gccは、私がfoo()にあまりにも多くの引数を渡しているという警告を投げさえしません。これは期待された動作なのでしょうか?
どのように解決するのですか?
C言語では、空のパラメータリストで宣言された関数は、呼び出されたときに任意の数の引数を受け付け、それらは通常の算術演算のプロモションの対象となります。 提供された引数が関数の定義に適切であることを確認するのは、呼び出し側の責任です。
引数ゼロの関数を宣言するには、以下のように記述します。
void foo(void);
.
これは歴史的な理由によるもので、元々Cの関数はプロトタイプを持たず、Cが次のように進化してきたためです。 B から発展し、型付けなしの言語となったためです。 プロトタイプが追加されたとき、後方互換性のために元の型なしの宣言が言語に残されました。
空のパラメータリストについてgccが警告を出すようにするには
-Wstrict-prototypes
:
引数の型を指定せずに関数が宣言または定義された場合に警告を表示します。(古い形式の関数定義は、引数の型を指定した宣言が先行していれば、警告を出さずに許可されます)。
関連
-
[C] レポートエラー 代入の左オペランドとしてlvalueが必要
-
[C] Error [Error] 代入の左オペランドとして lvalue が必要です。
-
警告:符号付き整数式と符号なし整数式の比較 [-Wsign-compare]
-
[解決済み] Valgrind が初期化されていないバイトについて警告する
-
[解決済み] C 言語で const char* を char* に変換するには?
-
[解決済み] なぜGCCはa*a*a*a*aを(a*a*a)*(a*a*a)に最適化しないのでしょうか?
-
[解決済み] C言語のコードで「:-!」とは何ですか?
-
[解決済み] 配列の場合、なぜ a[5] == 5[a] になるのでしょうか?
-
[解決済み] Cプリプロセッサはなぜ "linux "という単語を定数 "1 "と解釈するのですか?
-
[解決済み] なぜalloca()の使用はグッドプラクティスとみなされないのでしょうか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
libc++abi.dylib: NSException タイプの捕捉されない例外で終了するエラー
-
C++の配列コピー
-
error: 'for' loop initial declaration is only allowed in C99 mode 原因と解決方法
-
[解決済み] Linux Socket write() によるBad File Descriptor C
-
[解決済み] c または c++ 用のシンプルな 2 次元クロスプラットフォームグラフィックスライブラリ?[クローズド]
-
[解決済み] アセンブリがCより速いのはどんなとき?[クローズド]
-
[解決済み] なぜC言語では構造体を頻繁にtypedefする必要があるのですか?
-
[解決済み] C 言語の配列へのポインタ/ポインタの配列の曖昧さ解消
-
[解決済み] C言語の構造体(CGRectやCGPointなど)をNSLog化することは可能ですか?
-
[解決済み】C言語のvoid引数「void foo(void)」と「void foo()」はどちらが良いのか?) [重複している]。