No.5ベストアンサー
- 回答日時:
②についてはその通り. C では「使う前に宣言する」ことで一貫している. いわゆる「オブジェクト指向」言語ではそのように限定すると (心理的に) 問題
を生じる可能性があるので若干緩めていると考えられる.
①③は未定義動作に関する話だから, 規格上はいかなる指定もしていない. 未定義動作だから処理系によって挙動が変化することはあり, 実際に GCC と VC とで違う振舞いをするケースもある.
なお ③ については (デフォルトオプションの) GCC でエラーを出すプログラムも書ける.
No.4
- 回答日時:
規格上は #2 の指摘の通り. 少なくとも C99 以降においては
An identifier is a primary expression, provided it has been declared as designating an object (in which case it is an lvalue) or a function (in which case it is a function designator).
(式中で用いる識別子は宣言されていなければならない)
と規定されており, さらに
Thus, an undeclared identifier is a violation of the syntax.
(だから未宣言の識別子を使うのは文法上アウト)
と脚注が付いている.
その時点でもう「ダメ」なプログラムなのだから, そこに「正しい動き」など存在しない. 同時に「『正しくない』動き」も存在しないので, 例えば
いきなり鼻歌を歌いだす
ようなことになったとしても, 文句はいえない.
余談.
そのプログラムにおける「コードの意図」がさっぱりわからん.
まとめるとこうなるのかな?
①c99では暗黙の関数宣言は廃止されたから、本来はコンパイルエラーとなるべき。だけどgccは未だ暗黙の関数宣言を既定では採用し、警告で注意喚起に止めている。
バグというより、互換性をどの辺に置くかの判断の問題?
②関数の呼びたしより、ソース上で「前」に関数の宣言、定義がないと
関数の呼び出しで暗黙の関数宣言が採用される。
#Javaとか後でも良い言語は多いけど、Cは違う
③同一ソースで同名関数に2つの解釈生まれても、c99より前のcではコンパイル可能。パラメー夕の引き渡しでそごが生じることが有る。
③はエラーになると思ってました。
まあ別ファイルだと全くチェックかからないのがCだから
そんなものなのかな。
No.3
- 回答日時:
具体的には, どのような「挙動」に対して「バグなんでしょうか?」と問うている?
まあプロトタイプくらい書くのが常識だとは思うが.
>具体的には, どのような「挙動」に対して
>「バグなんでしょうか?」と問うている?
写真の一番最後の行が実行結果で、コードの意図と異なってて
Twitter上で驚きの声が広がっているという話です。
恐らく、関数呼び出しではプロト夕イプなしの解釈、
関数定義ではプロトタイプ有の解釈
で引数が正常に渡らない ということだと思うのですが
Cコンパイラでは同一ソース内で同名の関数に異なる解釈が
生まれても放置というのが正しい動きなのか
というのが質問の主旨です。
No.2
- 回答日時:
GCC 5 の変更点に、C言語のデフォルトは C89 から C11 とするとあり
> The default mode for C is now -std=gnu11 instead of -std=gnu89
C99 の変更点に、暗黙的な関数宣言は廃止するとあり
> Major changes in the second edition (__STDC_VERSION__ 199901L)
> - remove implicit function declaration
そのためデフォルト設定の gcc では、
C言語の暗黙的な関数宣言を、規格違反として警告していると推測します。
対策としては
1. 関数は定義や宣言をしてから使うように見直す
2. すべての関数宣言をヘッダ化して冒頭に include させる
3. オプション -std=c90 を指定する
参考)
https://gcc.gnu.org/gcc-5/changes.html
https://www.open-std.org/jtc1/sc22/wg14/www/docs …
No.1
- 回答日時:
ご指摘のバグ某を全く知らないですが、私自身の環境で試してみました。
いずれのgccも私自身でコンパイルしたものです。$ cat test.c
#include <stdio.h>
void func1 ( void )
{
func2 ( 1.0, 2 );
}
void func2 ( int a, double b )
{
printf ( "%d %f\n", a, b );
}
int main ( void )
{
func1 ();
}
$ gcc --version
gcc (GCC) 10.1.0
Copyright (C) 2020 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ gcc test.c
test.c: 関数 'func1' 内:
test.c:9:1: 警告: implicit declaration of function 'func2'; did you mean 'func1'? [-Wimplicit-function-declaration]
9 | func2 ( 1.0, 2 );
| ^~~~~
| func1
test.c: トップレベル:
test.c:12:6: 警告: 'func2' と型が競合しています
12 | void func2 ( int a, double b )
| ^~~~~
test.c:9:1: 備考: 前の 'func2' の暗黙的な宣言はここです
9 | func2 ( 1.0, 2 );
| ^~~~~
一方...
$ gcc --version
gcc (GCC) 13.2.0
Copyright (C) 2023 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ gcc test.c
test.c: 関数 'func1' 内:
test.c:9:1: 警告: implicit declaration of function 'func2'; did you mean 'func1'? [-Wimplicit-function-declaration]
9 | func2 ( 1.0, 2 );
| ^~~~~
| func1
test.c: トップレベル:
test.c:12:6: 警告: conflicting types for 'func2'; have 'void(int, double)'
12 | void func2 ( int a, double b )
| ^~~~~
test.c:9:1: 備考: previous implicit declaration of 'func2' with type 'void(int, double)'
9 | func2 ( 1.0, 2 );
| ^~~~~
さらにさらにtest.cをtest.cppにリネームしてみました。
$ mv test.c test.cpp
$ gcc --version
gcc (GCC) 10.1.0
Copyright (C) 2020 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ gcc test.cpp
test.cpp: 関数 'void func1()' 内:
test.cpp:9:1: エラー: 'func2' was not declared in this scope; did you mean 'func1'?
9 | func2 ( 1.0, 2 );
| ^~~~~
| func1
$ g++ test.cpp
test.cpp: 関数 'void func1()' 内:
test.cpp:9:1: エラー: 'func2' was not declared in this scope; did you mean 'func1'?
9 | func2 ( 1.0, 2 );
| ^~~~~
| func1
$ gcc --version
gcc (GCC) 13.2.0
Copyright (C) 2023 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ gcc test.cpp
test.cpp: In function 'void func1()':
test.cpp:9:1: エラー: 'func2' was not declared in this scope; did you mean 'func1'?
9 | func2 ( 1.0, 2 );
| ^~~~~
| func1
$ g++ test.cpp
test.cpp: In function 'void func1()':
test.cpp:9:1: エラー: 'func2' was not declared in this scope; did you mean 'func1'?
9 | func2 ( 1.0, 2 );
| ^~~~~
| func1
バージョンの違いでメーッセージの内容に違いはないように見えます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- レトロゲーム ファイアーエムブレム聖戦の系譜について。4章空に舞うでシルヴィアで訪問すると守りの剣が貰える村に行く 1 2021/12/24 05:49
- その他(ゲーム) PC版スカイリムでのバグ対処法 1 2023/09/10 17:25
- iPhone(アイフォーン) 位置情報アプリの友どこについてなんですが、昨日まで全く使えていたのに、今日いきなりバグって使えなくな 1 2023/07/22 16:04
- Instagram Instagramでバグが起きました。Androidです。 画像は左がストーリーにあげた後です。右が 1 2022/08/18 11:55
- デスクトップパソコン 光学ドライブのトレーを閉めると画面が真っ黒になりグラボのファン?ブン回り?? 2 2023/05/19 08:45
- その他(OS) 私の地元の今時の小学生の男子が、友達2人で、何がバグったんか知らんけど、『あれ、バグってるやんなー』 4 2023/11/21 17:30
- C言語・C++・C# exeファイルが作れない(windows10) 6 2022/08/13 08:47
- カードゲーム 原神について質問です。 1 2023/07/14 01:47
- YouTube Youtubeがアップグレードされてから起きた問題 1 2022/11/03 04:43
- C言語・C++・C# gcc のコンパイラオプションについて 2 2022/12/21 17:11
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教える店舗&オフィスのセキュリティ対策術
中・小規模の店舗やオフィスのセキュリティセキュリティ対策について、プロにどう対策すべきか 何を注意すべきかを教えていただきました!
-
C言語って古いですか?
C言語・C++・C#
-
これなにがちがうんですか??
C言語・C++・C#
-
パイソン。If elseの挙動について教えてください。パソコンは、if else で、まずifに当て
C言語・C++・C#
-
-
4
C言語 バッファについて。
C言語・C++・C#
-
5
double型が正常に認識されていない恐れ
C言語・C++・C#
-
6
変数名を引数として渡す、アドレスを引数として渡す方法
C言語・C++・C#
-
7
C言語関数違いについて。
C言語・C++・C#
-
8
C言語について。
C言語・C++・C#
-
9
C言語について。
C言語・C++・C#
-
10
バッファリングについて。
C言語・C++・C#
-
11
C言語の関数と配列に関する質問
C言語・C++・C#
-
12
Javaって使いますか、もう古いですか?C++とどっちがいいですか?分析でC++使う授業ありましたけ
C言語・C++・C#
-
13
C言語について。
C言語・C++・C#
-
14
C言語について
C言語・C++・C#
-
15
License='MIT' ってなんでmitなんですか??適当なのでもいいですか? パイソン
C言語・C++・C#
-
16
C言語 列挙型(enum型)変数について
C言語・C++・C#
-
17
WindowsのCapsLock(キャップスロック)って、何の意味があるんですか?
C言語・C++・C#
-
18
C言語について。
C言語・C++・C#
-
19
chatgptでつくってもらったコードとかって頭のいい人はみるとわかりますか?
C言語・C++・C#
-
20
VisualStudio2022でC言語プログラムで全角文字を使用すると不明なエラーが表示される
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
レイノルズ数が4000より大きい...
-
gcc13.2のバグ?
-
oppo reno 7A
-
keygen.exeが実行されない
-
【InstallShield Wizard】 イ...
-
お気に入りの登録サイトが削除...
-
Linuxでの開発環境構築や設定の...
-
簡易ガンマ設定ツールの代替
-
フォルダーに緑のレ点と赤の✖が...
-
Beckyのアドレス帳を上下に移動...
-
[python]スクリプトから起動で...
-
アプリをC、Dのどちらに入れる...
-
HTMLで投票ボタンを作りたい
-
ユーザーアカウント制御の表示...
-
ノーツ エージェントの実行が...
-
タスクマネージャーが消えた。(...
-
FLASHゲームのセーブデータが消...
-
DOS/V 日本語環境構築
-
WindowsDefender以外のウイルス...
-
インストールしようとしている...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
gcc13.2のバグ?
-
レイノルズ数が4000より大きい...
-
MacBookでフルスクリーンを 解...
-
(2)の状態遷移表の書き方がわか...
-
selectにline-heightがきかない...
-
oppo reno 7A
-
フォルダーに緑のレ点と赤の✖が...
-
日本に、Microsoftのような会社...
-
インストールが不要なソフトは...
-
Linuxでの開発環境構築や設定の...
-
特定ユーザに対してのみアプリ...
-
windows10のアプリと機能にyout...
-
回復ドライブに保存されるもの
-
WindowsDefender以外のウイルス...
-
Beckyのアドレス帳を上下に移動...
-
Android studio 初心者 Hello A...
-
ペイント(mspaint.exe)がない...
-
vbsでデバッグしながらコードを...
-
Inkscape プリントマークでエラー
-
VC++にてボタン等のサイズ取得
おすすめ情報