C言語なら俺に聞け 158

■ このスレッドは過去ログ倉庫に格納されています
2021/12/25(土) 12:11:46.61ID:xxeaCAplM
!extend:checked:vvvvv:1000:512
(新スレ立ての際上記コマンドを2行書き込んでください)
C言語の話題のみ取り扱います C++の話題はC++スレへ
質問には最低限の情報(ソース/コンパイラ/OS)を付ける
数行で収まらないソースは以下を適当に使ってURLを晒す
https://paiza.io/
https://ideone.com/
http://codepad.org/

C17
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4713.pdf

C11
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.pdf

C99
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf
http://kikakurui.com/x3/X3010-2003-01.html

C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/

JPCERT C コーディングスタンダード
https://www.jpcert.or.jp/sc-rules/

※前スレ
C言語なら俺に聞け 157
https://mevius.5ch.net/test/read.cgi/tech/1624846971/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2022/06/12(日) 16:04:25.30ID:7muDz8Uq0
>>654
> 第一引数は不定なので

いいえ。 未定義動作です。
2022/06/12(日) 16:07:16.41ID:LzXoNMHn0
>>657
勝手に端折るなよ、 書いてあるのは
> 呼び出し側がnantoka()と書いたときも意味を持たせる場合どうすりゃいいの?
で、答えはできない
つまり
>>654 > できるぞ
がアホだってことな
2022/06/12(日) 16:17:07.73ID:2T6Ast9Ed
>>654
>第一引数なしで可変引数にするときは
可変引数になってないね
全然意味のない書き込みだね…
2022/06/13(月) 06:48:01.95ID:BOW2YZM80
>>658
不定の値にアクセスしたら未定義の動作だね
何が言いたい?

>>659
幼児レベルの罵倒語が必要か?
654は正しいのか誤っているのかどっちだ?

>>660
では聞くが可変引数って何だ?
JIS X3010にそんな用語はないが
662デフォルトの名無しさん (スップ Sd1f-asUV)
垢版 |
2022/06/13(月) 08:40:16.72ID:si/cekt2d
int func(void); と
int func(...); に対する言及なしで
int func(); だけ出てきてるからまともな議論じゃないと思ってスルーしてたが

可変引数は >>651 で出てきてそれに合わせてるだけじゃねーの?
663デフォルトの名無しさん (スップ Sd1f-asUV)
垢版 |
2022/06/13(月) 08:54:28.35ID:si/cekt2d
int func(void); だとそもそも引数なししか受け付けない。
int func(...); だと引数の型と個数を実装側が期待するものにしなければならない。間違えたら未定義動作。
int func(); だと引数の型がわからないまま関数を使う。間違えてたら未定義動作。

int func(...); の第1引数は普通は型を明示するから
int func(const char*, ...); のようになるが。
2022/06/13(月) 09:33:56.73ID:zy+KupId0
>>661
いいえ。 一致しない引数で関数を呼出そうとすることが未定義です。
2022/06/13(月) 10:21:00.47ID:BOW2YZM80
>>664
一致しないって何と何が?
funcについて仮引数は宣言されていない
よって実引数との型の比較行われず
一致にも不一致にもあたらないぞ
2022/06/13(月) 10:32:48.37ID:zy+KupId0
>>665
いいえ。 どこかに関数定義は存在し、関数定義 (の仮引数) とその関数呼出し (の実引数)
との矛盾 (引数の数があわない・型が適合しない) は許されていません。
667デフォルトの名無しさん (オッペケ Sr87-bFL4)
垢版 |
2022/06/13(月) 11:04:47.60ID:YiPaBYDZr
可変長引数では無理なのね
>>650の(2)の実装だとどうなるの
2022/06/13(月) 11:30:06.51ID:zy+KupId0
マクロでコンパウンドリテラルを作ってから (その個数と共に) 渡すという方法が取れると思う。
受け取る関数の型は >>645 の通りではできないけど。

#include <stdio.h>
#define foo(...) bar(sizeof((char[]){0, __VA_ARGS__}), (char[]){0, __VA_ARGS__})

void bar(int n, char* args) {
if(n==1) {
printf("no argment.\n");
} else {
printf("argment is %c.\n", args[1]);
}
}

int main(void) {
foo('a');
foo();
}
2022/06/13(月) 11:35:06.46ID:BOW2YZM80
>>666
話が噛み合っていないな
引数の数も型も比べる相手がいないのに矛盾しようがない
そもそも関数原型を用意しましょうなんていうのはCにおいて後付けの推奨事項に過ぎない
既存のコードを否定するのは影響が大きすぎるからな
2022/06/13(月) 11:47:54.04ID:ir4nxYTVd
>>661
自分で「可変引数にするときは」と言っておいて
なにが「そんな用語はない」だよ
頭おかしい
2022/06/13(月) 11:48:35.71ID:cwJzo4Jp0
fn(void)
fn(int)

こういう2種類の引数を許容したとして
呼ばれた側はどう区別したら良いんだろう
コンパイル時に、別関数にアサインしたらいいのかな
その場合は受け取る関数も二つ用意してやらないと行けないな
2022/06/13(月) 11:52:40.59ID:ir4nxYTVd
区別はできない
引数を見ようとしたら結果は不定になる
単なるバグだよ
2022/06/13(月) 12:04:59.49ID:63W4P7Hh0
(2)の想定はこれだった
https://wandbox.org/permlink/EidRL6a8uqiszn2m
これも引数0個のときは##__VA_ARGS__か__VA_OPT__が必要で
まずかったな
2022/06/13(月) 12:13:41.38ID:Bgq8kBxf0
>>669 関数定義とその呼び出しを比較するって書かれてるのに、きみが無視するから噛み合わないんだよ。
2022/06/13(月) 12:16:16.46ID:BOW2YZM80
>>674
void func() { } /* 定義 */
int main()
{
func(); /* 呼び出し */
}
どこが矛盾なんだ?

# 迂闊な答えをすると罠があるから気をつけな
2022/06/13(月) 12:18:15.22ID:BOW2YZM80
>>670
その時点ではアバウトな言葉遣いが容認される流れだったが
厳密さを求める流れにあんたが変えたんだよ
2022/06/13(月) 12:27:06.91ID:Bgq8kBxf0
>>675 その例だけなら矛盾しないね。でも引数渡せないから>645のやりたかったことはできないよね。
2022/06/13(月) 15:54:04.85ID:BOW2YZM80
>>677
引数が空のときにに意味を持たせるんだったな
void func() { puts("no arguments are given"); }
int main()
{
func();
}

# さっき言った「罠」がまだここにある
2022/06/13(月) 16:19:19.10ID:Bgq8kBxf0
まともに話す気なさそうだし、もういいや。

C言語では>>645に書かれてるようなことはできなくて、
>>654の「第一引数は不定」はどうせ未定義動作の間違い、
という点に異論が無ければ、これ以上語ることもない。
2022/06/13(月) 16:34:27.02ID:cwJzo4Jp0
nantoka()と呼び出した場合、
呼び出された関数は、
nanntoka(char adress)として
スタック上からadressを取り出そうとするが
ここにある値はNULLではなく、不定値(所謂ゴミ)
NULL判定で回避はできない
2022/06/13(月) 16:37:54.51ID:ir4nxYTVd
>>678

Once again, once again, you're on your own
Who's to blame? who's to blame? it's such a shame
No-one ever hears your name, or plays your game
682デフォルトの名無しさん (アウアウウー Sa67-MmlY)
垢版 |
2022/06/13(月) 18:45:35.75ID:+5MOS3Faa
>>680
> スタック上からadressを取り出そうとするが
だからそれを実行するかどうかもわからんって話
未定義動作ってそういうもんだ
683デフォルトの名無しさん (スッップ Sd1f-asUV)
垢版 |
2022/06/13(月) 18:53:43.72ID:HsopZ7m+d
グローバル変数 int exists_adress; を介してやれば引数あり/なし のモードを未定義動作を回避しつつ設定できそう
実用性など皆無だが
2022/06/13(月) 19:17:35.58ID:ir4nxYTVd
>>682
読み出すまではできるだろ
戻りアドレスか関係ないレジスタの退避値が入っている
問題はここではエラーにならず次にこの値で何かしようとしたらクラッシュする可能性が高い
これは単にコンパイラを騙して原因がわかりにくいエラーを出す方法なだけ
全くなんの意味もない
2022/06/13(月) 19:21:03.88ID:cwJzo4Jp0
分からないなら、試して見れば良いのに
2022/06/13(月) 19:40:41.59ID:+5MOS3Faa
>>684
だからコンパイラは読み出すコードを吐く義務はない
未定義動作とわかった時点で呼び出しすらしないコードを吐く可能性もある
未定義動作ってそういうもんだ
2022/06/13(月) 19:46:28.66ID:cwJzo4Jp0
読み出さなければ、実行時エラーにならないだろう
なんで、なるの?
2022/06/13(月) 19:48:48.04ID:cwJzo4Jp0
呼ばれた側の関数は、adressに入っている(はずの)値を使うんだぜ
コード吐かなければ、それこそコンパイラのバグになるぞ
2022/06/13(月) 19:52:23.50ID:cwJzo4Jp0
実際に呼び出すコードは、呼ばれた側の関数に実装されるが、
呼び出し側の引数セットありと、引数セット無しで、
違うコードが実行されたりするのか?
2022/06/13(月) 20:03:29.40ID:Q7R38T3J0
何が起こっても不思議ではない未定義派と、コンパイラ実装は実質こうなってる派で話が噛み合うはずがないと思うの。
2022/06/13(月) 20:05:01.34ID:cwJzo4Jp0
信仰と言うより、勘違いだろう
恥ずかしくて後に引けなくなった感じ
2022/06/13(月) 20:09:56.04ID:cwJzo4Jp0
引数セットするのは、呼び出し側
コンパイラが呼び出し側で引数がないと判定した結果、
気を利かせて呼び出さないコードを吐くって一体どういうことだろう

呼ばれた側は機械的にあるはずの引数にアクセスする
呼ばれる側はセットしてないなんて分からないからアクセスしてしまうぞ
693デフォルトの名無しさん (オッペケ Sr87-bFL4)
垢版 |
2022/06/13(月) 20:10:29.53ID:8KDu5nutr
>「罠」がある(キリッ
とかお寒いこと書いちゃうくらいだしよほど視野が狭くなってたんだろうなぁ
694デフォルトの名無しさん (アウアウウー Sa67-hiZJ)
垢版 |
2022/06/13(月) 20:15:33.10ID:iGSNe98na
stdcall と cdecl の話か?
どっちにしても引数省略されたのかされてないのか呼ばれた方では判らん
C++なら省略の代わりにデフォルト引数入れたりマングリングしたり出来るが
Cではどうしようもない
2022/06/13(月) 20:17:50.97ID:6K7aQgyCM
>>693
コピペで使えそうだなw
2022/06/13(月) 21:42:41.32ID:PLcvpN2h0
>>688-689,691-692
コンパイルエラーとして全くコードを吐かないという事すら可能なのに何を言ってるんだよ...
今時未定義動作すら考慮して最適化したりしてる時代なんだぞw
https://qiita.com/kaityo256/items/d2677e178be0180482e8
2022/06/13(月) 21:44:17.84ID:ir4nxYTVd
>>686
何か勘違いしてないか
コンパイラが未定義動作とわかったらエラーか最低でもワーニングを出す
コンパイラにはわからないからバグになるんだよ
2022/06/13(月) 22:00:44.23ID:cwJzo4Jp0
ワーニング笑
2022/06/13(月) 22:05:19.85ID:cwJzo4Jp0
一体どこのコンパイラがコード吐かずに停止するんだよ
2022/06/13(月) 22:14:04.47ID:PLcvpN2h0
>>697
> コンパイラが未定義動作とわかったらエラーか最低でもワーニングを出す
そんな義務はない
> コンパイラにはわからないからバグになるんだよ
同一翻訳単位ならわかるだろ
勘違いしてるのは君、と言うか君の知識が浅すぎるだけ

>>699
存在するかどうかは関係なく規格上はそう言う処理系でも規格準拠という話
2022/06/13(月) 22:42:16.41ID:cwJzo4Jp0
つまり実在しないコンパイラってことだな
2022/06/13(月) 22:44:07.87ID:cwJzo4Jp0
オレ以外、全員狂ってるって言ってるのと同じ
2022/06/13(月) 22:44:55.56ID:cwJzo4Jp0
こいつと同じ職場でなくて良かった
2022/06/13(月) 23:54:32.34ID:uF/nHRZy0
法解釈論「人殺しは違法であり罰される」
実運用論「証拠を完璧に隠滅できれば罰されない」

意固地になっちゃってるから何言っても無駄
2022/06/14(火) 03:02:34.64ID:bOBoFDUrM
意固地になるとアスペチックになるのか
アスペチックだから意固地になりやすいのか
2022/06/14(火) 06:01:33.60ID:WigeF4Tr0
意固地もなにも未定義動作なんて規格の話なんだから実運用論とか言われてもねw
2022/06/14(火) 06:16:24.48ID:XpDhKBGs0
>>679
第一引数が不定とは、第一引数を何らかの方法で取り出した場合の話だが
おまえさん、その方法はどんな方法を想定しているんだ?
2022/06/14(火) 07:36:21.84ID:/Eif446V0
自分で言った言葉に?みつく芸なんだろうか
2022/06/14(火) 10:22:14.90ID:2fucKJss0
>>707
>654が言ってるのはどうせこんなのだろうと思ってた。
https://wandbox.org/permlink/aiZH8Ytc91RyQ7HL
#include <stdio.h>
void func();
int main() { func(); }
void func(int x) { printf("%d\n", x); }
2022/06/14(火) 10:32:47.66ID:rBU/2bdp0
実体記述時と、宣言&呼び出し時とで、引数の型や個数の不一致
コンパイルが通るかもしれんけど、どう動くかわからないし
俺の環境ではこう動くからと、それを信じて採用するには怖すぎる
2022/06/14(火) 10:33:48.55ID:XpDhKBGs0
>>709
654は俺でまあそんなとこだが
俺は今679に聞いている

おそらく「654と同じ」とかなんとか言って
自分の手の内は隠したまま人の批判をするんだろうけどな
2022/06/14(火) 10:44:32.74ID:2fucKJss0
>>711 え? 679 (ワッチョイ 835f-GGE9) だから答えたのに何でよくわからんイチャモンつけられてんの?
いやまぁ、予想通りで結論に異論無いならいいんだけどさ。
2022/06/14(火) 10:50:39.67ID:rBU/2bdp0
省略時のデフォルト引数と(マングリング等による)別実装
C以前の言語でもありそうだし前者は検討してそうなもんだけど見送ったなりの理由があるんだろうか
2022/06/14(火) 10:52:59.20ID:2fucKJss0
想定が合ってたということで改めて結論も明記しとくと、
>709 のプログラムが未定義動作を起こすのは不定な x の値を使用するからではなく、
func(int x) に対して引数の数が不正な関数呼び出し func() を行うからであって、
x の値を使用しない場合(例えば関数内を空にした場合など)ても未定義動作になる、という話ね。
2022/06/14(火) 10:53:17.30ID:XpDhKBGs0
>>712
ほらな、やっぱり自分の手の内は晒さない
2022/06/14(火) 11:13:15.99ID:rBU/2bdp0
661の立場だと
 void func(int x) { }
 ・・・・・
 func();
は、記述のほうで x をリファレンスしてないからセーフで未定義には該当しないと読めるが
そいう主張なのかな
717デフォルトの名無しさん (オッペケ Sr87-bFL4)
垢版 |
2022/06/14(火) 11:51:03.61ID:2oEiwFQbr
引っ込みつかなくなると大変だね
2022/06/14(火) 12:19:58.97ID:zr4Ezotf0
単に使われない変数があるってだけだと思うが
2022/06/14(火) 12:58:48.08ID:WigeF4Tr0
>>718
>>717ww
2022/06/14(火) 13:36:14.16ID:rBU/2bdp0
実装の話
関数側でスタックに詰まれた引数をクリーンアップする呼び出し規約(pascalcall や stdcall) だと
明後日に飛んでいくのか
721デフォルトの名無しさん (ワッチョイ ffad-L0LW)
垢版 |
2022/06/14(火) 19:11:20.40ID:DieH08Hx0
引き数の値で関数内の処理を分けるか普通に関数分ければいいやん
2022/06/14(火) 21:11:51.49ID:VPcVb+UNM
普通の人ならそうするが、
普通で無い方法が無いかを
いろいろ議論している
暇つぶしとも言う
2022/06/14(火) 21:17:41.30ID:XpDhKBGs0
特定されない限りあらゆるケースを想定するからな
2022/06/14(火) 23:50:32.80ID:dnqAP5Hg0
>>718
DLLの呼び出しみたいに呼び出し先の実装をコンパイラが知らない場合
例えば引数をスタックに積む呼び出し規約だと
↓正常な動作
1)戻り先のアドレスをスタックに積む
2)引数をスタックに積む
3)DLL側のコード実行時にpopしてスタックから引数ゲット
4)いろいろ処理してpopして戻り先アドレスをゲットしてりたーん
これが↓異常な動作
1)戻り先のアドレスをスタックに積む
2)なんもない
3)DLL側のコード実行時にpopしてスタックから引数ゲット
4)いろいろ処理してpopして戻り先アドレスをゲットしてりたーん
5)わし、迷子
ってなるんちゃうん?
引数がレジスタ渡しなら、ただ変な数値受け取るだけで済むけど、今ここでの話じゃ限定してないようだし
2022/06/15(水) 00:28:34.16ID:kIvvyTdz0
呼び出しって引数をスタックに積んでから、呼び出すんじゃなかったかな
2022/06/15(水) 00:38:49.11ID:3+VQJWvy0
>>725
そうだよ
だから func(int);な関数をfunc(void); で呼び出したらスタックにずれが生じる可能性がある
2022/06/15(水) 00:43:20.78ID:kIvvyTdz0
引数をスタックに積んでから、戻りアドレスを積んでCallするなら、
func関数はスタック先頭位置にあるアドレスに戻るだけではないかな
積まれている引数はその下だからズレないと思う
2022/06/15(水) 00:57:26.32ID:3+VQJWvy0
>>727
>引数をスタックに積んでから、戻りアドレスを積んでCallするなら、
逆だぞ
戻りアドレスをスタックに積んでから引数をスタックに積む、その状態でfuncをコールする
そうしないと、次のpopでは戻りアドレスを受け取ることになり、引数を受け取れない
コールされたfuncはpopし引数を受け取って処理(この間にスタックへのpush/popがあったりして)、最後にpopして戻りアドレスを受け取って呼び出し元に帰る
2022/06/15(水) 01:08:25.20ID:kIvvyTdz0
戻りアドレスをスタックに積むのは、機械語のCALL命令が行うんでしょう?
2022/06/15(水) 01:16:07.05ID:kIvvyTdz0
VCでアセンブラソース出力させてみました
int main()
{
 call(1);
 call();
 return 0;
}
int call()
{
 return 0;
}
2022/06/15(水) 01:17:50.09ID:kIvvyTdz0
_main PROC
; Line 2
 push ebp
 mov ebp, esp
; Line 3
 push 1
 call _call
 add esp, 4
; Line 4
 call _call
; Line 5
 xor eax, eax
; Line 6
 pop ebp
 ret 0
_main ENDP
2022/06/15(水) 01:18:18.33ID:kIvvyTdz0
_call PROC
; Line 8
 push ebp
 mov ebp, esp
; Line 9
 xor eax, eax
; Line 10
 pop ebp
 ret 0
_call ENDP
2022/06/15(水) 01:22:13.35ID:3+VQJWvy0
そうでした
うんこは消えます
2022/06/15(水) 05:01:22.73ID:oeHjaPLHa
フレームポインタってのもあって
まあなんでもいいんです
735デフォルトの名無しさん (アウアウウー Sa67-iSSN)
垢版 |
2022/06/15(水) 15:38:51.27ID:IEWflW3Ga
>>728
馬鹿発見
2022/06/15(水) 18:22:38.94ID:mSaBC5As0
>729
全てのCPUにCALL相当の命令があるとは限らないってことを頭の片隅に。
2022/06/15(水) 19:14:29.02ID:kIvvyTdz0
CALL命令のないCPUにCってどういう風に実装するのかな
キッと神様のような人だろうと思う
2022/06/15(水) 19:34:49.70ID:vqdnmmaIa
最近call見ないよね
命令はあるけど
2022/06/15(水) 19:53:29.20ID:XKwaNEU70
>>736
C言語で書いたコードが実行できるようなCPUでCALL相当の命令がない奴なんてあるのか?
まさかと思うけどBSR(Branch SubRoutin)とかBAS(Branch and Save)はCALLと綴りが違うんだーっていう主張じゃないよね
2022/06/15(水) 19:55:51.69ID:XKwaNEU70
>>737
汎用機みたいにスタックが無いマシンだとソフトでスタック作るとかする
2022/06/15(水) 20:05:59.02ID:kIvvyTdz0
呼出も戻りも、ジャンプ命令で実装するんかい?

「食らえ、GOTO攻撃!」
2022/06/15(水) 20:06:30.10ID:gppE9X5h0
>>737
厳密じゃないけど、
push pc
jmp xxxx
 :
pop pc
みたいな。push pcする時にjmpのアドレスの次を
2022/06/15(水) 20:07:41.69ID:gppE9X5h0
途中で書き込んてしまった。

>>737
厳密じゃないけど、
push pc
jmp xxxx
 :
pop pc
みたいな。push pcする時にjmpの次のアドレスをpushする必要があるけど。
2022/06/15(水) 20:29:16.05ID:mSaBC5As0
>739
2000年あたりのスパコンのデバッグやってたけどスタックポインタ自体無かったよ。
汎用レジスタの一つをスタックポインタの様に使ってた。
スパコンのPEはCPUじゃ無いっていうならそれまでだけど。

OSがCで書かれてたよ。
2022/06/15(水) 20:38:36.75ID:VY0KZJ3n0
専用のレジスタを用意するかわりにアドレシングモードを充実させてるタイプの CPU もあるとは聞いたことは有る。
複数のスタックを用途別に使ったりする運用も出来るので便利っぽいよ。
2022/06/15(水) 20:42:40.26ID:Z7kfo4VR0
リンクレジスタを使うアーキテクチャは
呼び出しも戻りもジャンブだよ
2022/06/15(水) 21:27:21.82ID:XKwaNEU70
>>744
だから>>740に書いたように汎用機みたいにハードウェアスタックが無いプロセッサーは普通にあるよ
でもBASみたいにサブルーチンを呼び出す命令はある(戻りアドレスをレジスタに格納してジャンプする)
スパコンの命令セットは見たことないけど似たような命令はあると思う
2022/06/15(水) 21:32:09.09ID:mSaBC5As0
JMPで呼び出した関数に飛んで、
JMPで呼び出し元に戻って行ってたよ。
RET、それ相当の命令が無かった(使われてなかった?)。
2022/06/15(水) 21:47:48.01ID:vqdnmmaIa
ぴゅう太のCPUとか全然レジスタなかった
2022/06/15(水) 21:51:15.67ID:XKwaNEU70
>>748
どこのスパコン?
751デフォルトの名無しさん (ワッチョイ cfbb-D3sd)
垢版 |
2022/06/15(水) 21:56:54.74ID:Ltc382Vw0
Z8スーパーコンピュータ
2022/06/15(水) 21:58:58.10ID:XKwaNEU70
>>749
あれはレジスタはメモリー上に置くって言う設計思想だから
2022/06/15(水) 22:55:33.80ID:mSaBC5As0
>750
富士通。
実機は見たこと無い。
なんかアメリカに設置されてて、日本の端末(FMVにFreeBSDかなんか入れてた)からtelnetで入って作業してた。
入社1年目だったんでテスト作業員+フリーズした場所の特定と原因予想してた。
2022/06/16(木) 07:08:44.59ID:ilsRfae90
STM 14,12,12(13)
LR 12,15
GETMAIN RU,LV=72
ST 13,4(,1)
ST 1,8(,13)
LR 13,1
2022/06/16(木) 07:48:03.24ID:acnLqVz40
>>753
2000年辺りならベクトルタイプのVPP シリーズの方かな
スカラパラレルはUltraSPARCだし
2022/06/16(木) 14:04:28.10ID:6d6damS40
① struct _Hoge;
② typedef struct _Hoge Hoge;
③ struct _Hoge { int a; };
④ typedef struct _Hoge { int a; } Hoge;

↑の①~④はどれが「定義」でどれが「宣言」かよくわからんです
typedef の def は define(定義)の def ですが
変数作って値を定義していないので全部宣言ですかね?
2022/06/16(木) 14:15:11.58ID:ilsRfae90
原則、重複が許されるのが宣言、許されないのが定義
ただし仮定義のような例外も一部ある
2022/06/16(木) 14:18:30.74ID:6d6damS40
そうすると①は宣言ですね
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況