1 名前:デフォルトの名無しさん (ワッチョイ 0f63-sFbk) mailto:sage [2023/04/21(金) 14:05:20.18 ID:rqj2HSDF0.net] !extend:checked:vvvvv:1000:512 (新スレ立ての際上記コマンドを2行書き込んでください) C言語の話題のみ取り扱います C++の話題はC++スレへ 質問には最低限の情報(ソース/コンパイラ/OS)を付ける 数行で収まらないソースは以下を適当に使ってURLを晒す https://paiza.io/ https://ideone.com/ codepad.org/ C17 www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4713.pdf C11 www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.pdf C23 最新ドラフト https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3047.pdf C99 www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf kikakurui.com/x3/X3010-2003-01.html C FAQ 日本語訳 www.kouno.jp/home/c_faq/ JPCERT C コーディングスタンダード https://www.jpcert.or.jp/sc-rules/ ※前スレ C言語なら俺に聞け 160 https://mevius.5ch.net/test/read.cgi/tech/1672191630/ VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
173 名前:蟻人間 mailto:sage [2023/06/04(日) 22:34:54.92 ID:iTf1qDcyd.net] -std=c11
174 名前:はちみつ餃子 mailto:sage [2023/06/04(日) 23:06:52.44 ID:MHoxWKtY0.net] >>170 C11 で規定されているけれど仕様としてはオプショナルなもの。 つまり処理系はそれを提供しなくても仕様準拠を名乗れる。 ただし、提供するならばマクロ __STDC_LIB_EXT1__ も定義しておくことになってる。 そんで使うときにはヘッダのインクルード前に __STDC_WANT_LIB_EXT1__ を define しておく必要がある。 MSVC は C11 が発行される前から scanf_s などを提供していた (というかマイクロソフトがこれらを標準に入れるように働きかけていた) のでバージョンによっては __STDC_WANT_LIB_EXT1__ を定義するという手順を介さなくても使えるのかもしれない。 私は MSVC を使ってないのでよう知らん。
175 名前:デフォルトの名無しさん mailto:sage [2023/06/04(日) 23:52:26.98 ID:AabPy4gc0.net] >>171 失礼しました gccでコンパイルしたところfopen_sという関数は定義されていないという趣旨のエラーが出た形です 以下詳細になります 環境:WSL2 Ubuntu コマンド(bash):gcc sample.c -o sample.out 出力: /home/hoge/Code/sample.c:17:13: warning: implicit declaration of function ‘fopen_s’; did you mean ‘fopen’? [-Wimplicit-function-declaration] 17 | if((error=fopen_s(&fp,filename,"r")) != 0){ | ^~~~~~~ | fopen /usr/bin/ld: /tmp/ccIXo3dN.o: in function `main': /home/hoge/Code/sample.c:17: undefined reference to `fopen_s' collect2: error: ld returned 1 exit status
176 名前:デフォルトの名無しさん mailto:sage [2023/06/04(日) 23:59:42.49 ID:AabPy4gc0.net] >>172 >>173 ありがとうございます! アドバイスを参考に以下のように変更しましたが174と同様のエラーが出ます(T_T) コマンドを以下のように変更 gcc -std=c11 sample.c -o sample.out ソースファイルの先頭に以下を記述 #define __STDC_WANT_LIB_EXT1__ 1
177 名前:デフォルトの名無しさん [2023/06/05(月) 00:18:53.38 ID:6AEqxzj80.net] なんか人気のfopen_s関数について https://blog.ef67daisuki.club/2017/04/%E3%81%AA%E3%82%93%E3%81%8B%E4%BA%BA%E6%B0%97%E3%81%AEfopen_s%E9%96%A2%E6%95%B0%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/
178 名前:デフォルトの名無しさん mailto:sage [2023/06/05(月) 10:37:04.03 ID:ejs/048Ga.net] legacy_stdio_definitions.lib
179 名前:デフォルトの名無しさん mailto:sage [2023/06/05(月) 18:03:48.62 ID:7VR84C5ud.net] fopen_sって初めて知った MS社内だけで通じる方言って感じでイヤな感じだな fopenで書くようにしたほうがいい
180 名前:デフォルトの名無しさん mailto:sage [2023/06/05(月) 18:11:20.30 ID:7VR84C5ud.net] だいたいwinAPIはファイルを開く時はCreateFile()系を標準にする方針だと思ってたんだが なんでfopenのパチモノを作るのか理解に苦しむ
181 名前:デフォルトの名無しさん mailto:sage [2023/06/05(月) 18:32:16.74 ID:OwVyUwPA0.net] 世界征服に決まってるだろ
182 名前:蟻人間 mailto:sage [2023/06/05(月) 18:47:37.75 ID:Fd2GxywXd.net] CreateFile はファイルロックの制御が細かくできたり、ファイルがすでに存在する場合の 処理や、セキュリティなどを考慮した処理など細かい設定ができる。 WindowsではfopenはCreateFileで実装されてるようだ。
183 名前:デフォルトの名無しさん (ワッチョイ 82ad-rilk) mailto:sage [2023/06/05(月) 19:09:52.27 ID:SzwJbur+0.net] >>179 CreateFileなんかで書いたら移植のとき困るだろ そもそもプラットフォーム気にせず書けるようにCライブラリとして標準化させようとしているんだし Windowsは移植性を考慮しないならCreateFile系のほうが柔軟に高度なプログラミングが出来るからCreateFile系使えと言っているだけ
184 名前:デフォルトの名無しさん mailto:sage [2023/06/05(月) 20:35:19.71 ID:ZwQJL2Eg0.net] APIを使うと毎回特権リングを呼び出すから、 小さい読み書きが多いとオーバーヘッドになる Cランタイムはバッファを使って特権リングの 呼び出しを減らしている
185 名前:デフォルトの名無しさん mailto:sage [2023/06/05(月) 20:40:56.74 ID:LsGdvfPCd.net] >>182 標準化しようとするなら引数や戻り値をfopenに似せるべきだ これじゃ初心者はわざわざerrnoを受け取る変数を作らなければならないんだなと勘違いするだろ
186 名前:デフォルトの名無しさん mailto:sage [2023/06/05(月) 20:52:58.24 ID:SzwJbur+0.net] >>184 あくまでCライブラリとして標準化 古い関数に仕様を合わせる必要はないべ >これじゃ初心者はわざわざerrnoを受け取る変数を作らなければならないんだなと勘違いするだろ 仕様を読まない初心者が悪いと思うんだが
187 名前:デフォルトの名無しさん mailto:sage [2023/06/05(月) 20:54:52.49 ID:OwVyUwPA0.net] 委員長、読まなきゃ使えない関数は捨てられてしまうと思います!
188 名前:デフォルトの名無しさん mailto:sage [2023/06/05(月) 20:58:18.67 ID:SzwJbur+0.net] 初めて使う関数なら一度は仕様見ろよ
189 名前:デフォルトの名無しさん mailto:sage [2023/06/05(月) 21:10:47.13 ID:OwVyUwPA0.net] じゃあ、使う必要が出てきたら読むことにします 当分、読むことなさそう
190 名前:デフォルトの名無しさん (スッププ Sda2-KKRM) mailto:sage [2023/06/05(月) 21:43:17.97 ID:EJphWr1dd.net] >>185 必要はある 今回のようにfopen_sをfopenに書き換えようとする(または逆)場合に変なミスを誘発する 大した理由もなく戻り値を変更すべきじゃない(またはfopenの名前を使うべきじゃない)
191 名前:デフォルトの名無しさん [2023/06/05(月) 23:26:16.43 ID:wc9Gft1n0.net] >>168 void*について学習してきました。 キャストしないと使えないようですが、キャストする型の指定はswitch-caseや#ifなどで分岐する感じでしょうか? それとももっと賢いやり方がありますか?
192 名前:蟻人間 mailto:sage [2023/06/05(月) 23:46:37.21 ID:pW8wFDDTd.net] >>190 memcpyなら型が分からなくとも無理やりコピーできる。
193 名前:デフォルトの名無しさん [2023/06/06(火) 00:27:27.18 ID:WKo3IR4c0.net] void*は元の形がint*でもchar*でもとりあえず何でもありで受け付けるやつ 元の型が何だったかは結局はプログラマ側が保証しとかないといけないので取り扱いは結構危険
194 名前:デフォルトの名無しさん (ワッチョイ 82ad-rilk) mailto:sage [2023/06/06(火) 03:21:52.62 ID:JM/jMtmO0.net] >>189 >大した理由もなく戻り値を変更すべきじゃない 関数の戻り値でエラーを返すことでグローバル変数のerrno読み出しタイミングの問題(マルチスレッド対策)に対応したいところって意図だと思うけど違うんかね? まあ戻り値ではハンドル返してアドレス渡しでエラーを受け取るという方法もあるとは思うけど >またはfopenの名前を使うべきじゃない 機能としては同じだし俺は別にfopen系の名前のほうが分かりやすくて良いと思う 言いたいことは分かるけどさ、初心者やベテランに関わらずちゃんと仕様を確認するってだけのことじゃね?
195 名前:デフォルトの名無しさん [2023/06/06(火) 08:23:57.44 ID:Wehdob+6d.net] fprintf_sとかの他の関数がerrnoを返さない以上、 fopen_sでだけerrnoを返しても一貫性がなくて無意味に感じられるんだよな。 結局のところerrno自体をスレッドセーフになるように作るしかなくて、 それで解消したんじゃなかったっけ?
196 名前:デフォルトの名無しさん mailto:sage [2023/06/06(火) 08:40:25.14 ID:SiwHVjTU0.net] >>161 を見てると コンテナに入れたいのは int な整数なんよな リングバッファだから 積む側と引っ張り出す側のそれぞれのインターフェースが必要になるけど void push(int); 実体を受けて内部で malloc してそっちに格納 void pop(int*); malloc された内容を 引数に渡して mallocしたポインタは free しとく この int の部分が任意の型でよしなにしようとすると void push(void* , size_t size);
197 名前:デフォルトの名無しさん mailto:sage [2023/06/06(火) 08:42:43.61 ID:SiwHVjTU0.net] 途中送信してもた void push(const void* , size_t); 実体はポインタで渡す void pop(void* , size_t); のように size_t で実体のサイズもらうしかないよね
198 名前:はちみつ餃子 mailto:sage [2023/06/06(火) 08:43:39.37 ID:TmtPJsyo0.net] >>193 errno は C11 以降は thread local storage ということになってる。 errno をセットした後に別のスレッドによって内容が書き換えられるということはない。 (やろうとすれば出来なくはないが……。 普通に使ってて間違ってやってしまうということはないだろう。) C99 でも errno は変更可能な左辺値 (に展開されるマクロ) であることは要求されているが それが関数呼出しによって得られるものであってもかまわないという記述もあり、 スレッドまわりで問題を起こさないようにする処理はその関数に入れることが出来る。 C99 ではスレッドローカルの概念は提供していないが事実上はスレッドローカル的な 実装に出来るように配慮されてる。 errno が不格好な設計であるのは確かだが、マルチスレッドでは問題にはならない。
199 名前:デフォルトの名無しさん [2023/06/06(火) 13:00:47.04 ID:h4TMdgn6a.net] >>182 そんなのは fork を先にさっさと実装してから家
200 名前:デフォルトの名無しさん mailto:sage [2023/06/06(火) 13:06:36.37 ID:h4TMdgn6a.net] >>190 void *hoge は hoge++ 出来ないけど int *i は i++ 出来るし double *d も d++ 出来るし i++ と d++ で足される数も違う switch case で対応するのはおすすめしない
201 名前:デフォルトの名無しさん mailto:sage [2023/06/06(火) 13:23:11.34 ID:Ydo+/HsJM.net] >>198 forkは効率が悪いから必要ない プロセスは_spawnを使ってスポーンっと産み出すもんだw
202 名前:デフォルトの名無しさん mailto:sage [2023/06/06(火) 15:35:36.55 ID:DWV+4S+md.net] GetLastErrorみたいにスレッドローカルにすればいいんだよ
203 名前:デフォルトの名無しさん mailto:sage [2023/06/06(火) 21:21:59.69 ID:XFiIFtrgd.net] >>190 そろそろそのやり方自体が賢くないって気づかないかな
204 名前:デフォルトの名無しさん mailto:sage [2023/06/06(火) 21:26:13.17 ID:9F60+Uyo0.net] 是非賢いお手本をお願い
205 名前:デフォルトの名無しさん mailto:sage [2023/06/06(火) 21:43:27.13 ID:t5k+pzJSM.net] switchは良くないと思うよ 利用側でそれぞれの型用に別々の関数を書いて使う人が使い分ける感じじゃないかな それこそ知らんけどレベルで申し訳ないが
206 名前:デフォルトの名無しさん mailto:sage [2023/06/06(火) 22:36:35.79 ID:QLr+SdPOd.net] >>203 毎回関数を作る だってリングバッファだぞ 目をつぶっていても作れるぞw
207 名前:デフォルトの名無しさん mailto:sate [2023/06/07(水) 07:49:00.73 ID:uhVmgr37a.net] >>203 お手本の定番は qsort() だろ
208 名前:デフォルトの名無しさん mailto:sage [2023/06/07(水) 08:29:44.13 ID:MtVH7DHg0.net] >>205 そういうのはライブラリ化しておくべき
209 名前:デフォルトの名無しさん mailto:sage [2023/06/07(水) 09:26:39.45 ID:PykR7vOnd.net] fread(void *buf, size_t size, size_t n, … の順もあれば qsort(void *base, size_t num, size_t size, … の順もあって 行き当たりばったり感
210 名前:デフォルトの名無しさん mailto:sage [2023/06/07(水) 12:34:45.81 ID:hQs7a5Jyd.net] >>207 じゃあ、ほい struct CUE{ int size; int max; int inp; int out; char buf[1]; }; struct CUE *create_cue(int size, int max) { struct CUE *cue =malloc(sizeof(struct CUE)+size*max); if(cue){ cue->size=size; cue->max=max; cue->inp=cue->out=0 } return cue; } int cue_get(struct CUE *cue, void*data) { if( cue->inp ==cue->out ) return 0;//buffer empty memcpy(data,&cue->buf[cue->out* cue->size],cue->size); if(++cue->out>=cue->max) cue->out=0; return 1; } int cue_add(struct CUE *cue, void*newdata) { int index = cue->inp; if(++index>=cue->max) index=0; if( index ==cue->out ) return 0;//buffer full memcpy(&cue->buf[cue->inp* cue->size],newdata,cue->size); cue->inp=index; return 1; } 目をつぶって作ったのでバグがあっても知らない 要するにこういうことでしょ 他の人が言ってるように型チェックがまったく働かないので俺は使いたくない
211 名前:デフォルトの名無しさん (スッップ Sda2-NC7J) mailto:sage [2023/06/07(水) 13:05:36.32 ID:xTW5tL3jd.net] memcpyは余計だな。ポインタを返して後は使用者(自分)に委ねるね俺は
212 名前:デフォルトの名無しさん mailto:sage [2023/06/07(水) 14:05:23.13 ID:lsOQP3og0.net] 見てないけどCUEって時点でもう程度が知れる
213 名前:デフォルトの名無しさん [2023/06/07(水) 15:08:50.29 ID:hYVl7Kw10.net] 重箱の鬼の首をとる応用例 ・(Perlを)Pearl って時点でもう程度が知れる ・(Daemon を)Demon って時点でもう程度が知れる
214 名前:デフォルトの名無しさん mailto:sage [2023/06/07(水) 16:05:48.27 ID:e1NBMLRC0.net] Luciferの事もたまには思い出してあげて
215 名前:デフォルトの名無しさん mailto:sage [2023/06/07(水) 21:46:42.98 ID:xi4mV2dDp.net] ダブルスラッシュがコメントに採用されたのどの版から?
216 名前:デフォルトの名無しさん mailto:sage [2023/06/07(水) 22:41:36.55 ID:JgjHIelbd.net] >>210 概念的にはgetした瞬間にリングバッファから取り除かれてるはずなので 実際にはバッファが一回りするまで残っているが 消えてるかどうか曖昧で気持ち悪いのでコピーで返したほうが望ましい まあ好みかもしれんが
217 名前:デフォルトの名無しさん mailto:sage [2023/06/08(木) 11:06:02.87 ID:rxjbLVG0a.net] >>214 MSVC じゃなくて MS-C の 3 くらいからあったかも
218 名前:デフォルトの名無しさん (スプッッ Sd02-w9Bk) [2023/06/08(木) 12:46:07.00 ID:m0+KFU8md.net] C99から それ以前でもコンパイラ拡張で//コメントをサポートしてるのはあるらしいけど 以下のようなエッジケースで解釈が変わる b=a//**/ 2 ; //コメントを認めないならb=a/2; //コメントを認めるならb=a;
219 名前:デフォルトの名無しさん (ワッチョイ 916e-aXLw) mailto:sage [2023/06/08(木) 12:55:42.05 ID:ldHYl5bi0.net] > 目をつぶって作ったのでバグがあっても知らない そういうのは「作った」とは言わない
220 名前:デフォルトの名無しさん (ワッチョイ 5146-rNJ6) [2023/06/08(木) 13:01:02.12 ID:5qYvg3Wg0.net] 盲者のモノ作りなど認めない。
221 名前:デフォルトの名無しさん (ワッチョイ 4297-UW6r) mailto:sage [2023/06/08(木) 13:06:43.94 ID:2i+h5Gbt0.net] 目開けても何も見てない奴いるからな
222 名前:デフォルトの名無しさん mailto:sage [2023/06/08(木) 13:39:09.53 ID:JhrUsqpHd.net] 野良審査員には餌をやらん主義
223 名前:はちみつ餃子 mailto:sage [2023/06/08(木) 14:35:42.49 ID:Iro3x2NJ0.net] >>214 C99 からだが経緯としては先に C++ で採用されていたという事情がある。 C with Classes から C++ になる 1984 年頃に BCPL 風を参考にして スラッシュふたつで始めるコメント記法が導入され、 更に 1998 年にそのコメント記法も含めて ISO の規格として確立した。 C と C++ でプリプロセッサは共用することも多いだろうし コメントはプリプロセッサで除去するだろうから C++ で採用された段階で実際には C でもスラッシュふたつのコメント記法を 使えていた環境は割と有ったのだと思う。
224 名前:デフォルトの名無しさん mailto:sage [2023/06/08(木) 14:52:55.41 ID:ldHYl5bi0.net] マイクロソフトが独自拡張で当時C++のみのはずの//をCでも許していた 言わずと知れた屈指の大手がやっているので規格が追認することとなった
225 名前:デフォルトの名無しさん mailto:sage [2023/06/08(木) 16:45:48.60 ID:JA9B62300.net] gccも使えてた気がする
226 名前:デフォルトの名無しさん mailto:sage [2023/06/10(土) 18:04:06.65 ID:Yvl44ooC0.net] 90年後半からしか実務で使ってないけどVCでは普通に書けてたな UNIX系はベンダー製のCの制限が酷かった思い出
227 名前:デフォルトの名無しさん mailto:sage [2023/06/10(土) 18:47:34.87 ID:Yrme8ZC10.net] borlandやwatcomでも使えなかったっけか?
228 名前:デフォルトの名無しさん mailto:sage [2023/06/10(土) 20:49:31.43 ID:6EfmWVuRd.net] 便利だからね オプションで使えなくすることもできたはず
229 名前:デフォルトの名無しさん (ワッチョイ c1bb-s+nx) mailto:sage [2023/06/16(金) 01:45:49.62 ID:q8ApsJJ90.net] int a[3] = {}; int b[3] = {0}; aの初期化はgcc拡張で規格に沿っているのはbの初期化だと記憶していたんだけど、 規格の6.7.8を見るとメンバの個数より波カッコで囲まれた初期化子が少ない場合は暗黙的に静的に初期化するとあった。 この規格の文章を見る限りはaも規格に合致していると思えるんだけど、aがgcc拡張っていうのは本当ですか?
230 名前:228 (ワッチョイ c1bb-s+nx) mailto:sage [2023/06/16(金) 02:08:30.52 ID:q8ApsJJ90.net] 参照した規格はX 3010:2003 (ISO/IEC 9899:1999) です
231 名前:デフォルトの名無しさん (ワッチョイ e95f-2rqm) mailto:sage [2023/06/16(金) 08:46:04.94 ID:qgM8i0iT0.net] >>228 本当。文法が空の {} を許していない。 initializer: assignment-expression { initializer-list } { initializer-list , } initializer-list: designation(opt) initializer initializer-list , designation(opt) initializer C23 から↓で initializer に {} が追加されてようやく通るようになる。 https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2900.htm
232 名前:デフォルトの名無しさん (アウアウウー Sadd-g1CP) mailto:sage [2023/06/16(金) 16:12:05.48 ID:ly+Q1cW8a.net] struct hoge { char a[]; }; struct fuga { char a[0]; };
233 名前:デフォルトの名無しさん (ワッチョイ c1bb-s+nx) mailto:sage [2023/06/16(金) 16:20:37.85 ID:q8ApsJJ90.net] >>230 なるほど構文規則ってところを見るんですね どうもありがとう
234 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ c13e-2rqm) mailto:sage [2023/06/16(金) 17:28:57.05 ID:QEmhRLek0.net] >>228 gcc でも -pedantic オプションを付けたら警告は出るぞ。 > warning: ISO C forbids empty initializer braces
235 名前:デフォルトの名無しさん (ワッチョイ 0dbb-p8ty) mailto:sage [2023/06/17(土) 21:50:15.83 ID:q+Kf8pNU0.net] >>233 知りませんでした! どうもありがとう
236 名前:デフォルトの名無しさん (ワッチョイ a52d-wYA+) mailto:sage [2023/06/25(日) 08:36:37.75 ID:D6GgnyEK0.net] int main(void)って書く流派ってどこでそんなの身に着けたの?
237 名前:デフォルトの名無しさん (ワッチョイ 856e-gmRT) mailto:sage [2023/06/25(日) 09:20:49.86 ID:yrM2OONq0.net] >>235 ISO/IEC 9899:2011 5.1.2.2.1 Program startup 1 The function called at program startup is named main. The implementation declares no prototype for this function. It shall be defined with a return type of int and with no parameters: int main(void) { /* ... */ }
238 名前:デフォルトの名無しさん (ワッチョイ 4b46-GfJH) [2023/06/25(日) 10:53:26.83 ID:/MLTigPj0.net] >>235 この指摘をしばしば見るが、int main(void) が違反だった時代はいつ頃なの。
239 名前:デフォルトの名無しさん (ワッチョイ a52d-wYA+) mailto:sage [2023/06/25(日) 10:56:42.79 ID:D6GgnyEK0.net] C99からint main(void)と書いてもいいらしい
240 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ dd3e-F8yx) mailto:sage [2023/06/25(日) 11:13:38.04 ID:+vRVyhzX0.net] main については C89 のときから変わってないよ。
241 名前:デフォルトの名無しさん (ワッチョイ 856e-gmRT) mailto:sage [2023/06/25(日) 11:58:52.46 ID:yrM2OONq0.net] >>237 K&R Cにはvoidというキーワードが存在しなかった
242 名前:デフォルトの名無しさん (ワッチョイ a52d-wYA+) mailto:sage [2023/06/25(日) 12:22:01.62 ID:D6GgnyEK0.net] K&R第2版にint main(void)なんて書き方出てきた記憶がないんだよね
243 名前:デフォルトの名無しさん (ワッチョイ a397-HUf/) mailto:sage [2023/06/25(日) 12:38:23.47 ID:6RRGV0Qg0.net] printf(null);
244 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ dd3e-F8yx) mailto:sage [2023/06/25(日) 12:38:51.73 ID:+vRVyhzX0.net] >>241 日本語版だと 41 ページに 「リストが明らかに空であるときには,予約語 void を使うべきである」 と書かれているのを見つけた。
245 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ dd3e-F8yx) mailto:sage [2023/06/25(日) 17:09:36.88 ID:+vRVyhzX0.net] 関数定義のときに仮引数がゼロ個なら void を書くのは当然の作法なんだから main についてはどうでも良いとはいえども main だけ空にするのもなんか変じゃない?
246 名前:デフォルトの名無しさん (ワッチョイ 1b79-SnHJ) mailto:sage [2023/06/25(日) 19:26:05.36 ID:20Xxe9+j0.net] 処理系は引数で任意のスタートアップを指定できるからmain書きたくない需要も満たせるよ
247 名前:デフォルトの名無しさん (スッププ Sd43-W+UZ) mailto:sage [2023/06/25(日) 22:39:44.42 ID:7VFzLtX7d.net] >>235 めんどくさいだけだろ
248 名前:デフォルトの名無しさん (ワッチョイ 955f-bte+) mailto:sage [2023/06/26(月) 06:14:35.93 ID:F8cl0T7T0.net] めんどくさい流免許皆伝
249 名前:デフォルトの名無しさん (ワッチョイ 4b46-GfJH) [2023/06/26(月) 07:16:23.26 ID:xzT4Agq20.net] 初級、めんどくさいので略記 初段、めんどくさいので無注釈 免許皆伝、めんどくさいので無ドキュメント
250 名前:デフォルトの名無しさん (ワッチョイ ad5f-9QlF) mailto:sage [2023/06/26(月) 08:07:26.96 ID:5ZBA7oeF0.net] 組み込み系ならmainに引き数なんて不用
251 名前:デフォルトの名無しさん (スプッッ Sd03-+QuN) mailto:sage [2023/06/26(月) 08:52:43.48 ID:r2qj24yMd.net] 元々プログラムはまんどくさいを代行するものだし・・・
252 名前:デフォルトの名無しさん (ワッチョイ 856e-gmRT) mailto:sage [2023/06/26(月) 12:05:19.83 ID:TXNTP2LF0.net] 組み込みでmainか・・・ ベクタテーブル作るときのラベルがマングリングされてないから短く済むけどそれだけ
253 名前:デフォルトの名無しさん (ワッチョイ 856e-gmRT) mailto:sage [2023/06/26(月) 12:06:17.67 ID:TXNTP2LF0.net] あ、ここCだっけ サーセン
254 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ dd3e-F8yx) mailto:sage [2023/06/26(月) 13:00:03.75 ID:DZPgqn/v0.net] >>249 main に引数が有るか無いかの話じゃなくて、無いときに void を書くという話題だよ。
255 名前:デフォルトの名無しさん (ササクッテロラ Sp81-9QlF) mailto:sage [2023/06/26(月) 13:16:56.95 ID:6bPwUIFfp.net] 実際の組み込み系には、二つのmainエントリーがある 引数のある奴と、無い奴な
256 名前:デフォルトの名無しさん (ワッチョイ 856e-gmRT) mailto:sage [2023/06/26(月) 13:20:15.17 ID:TXNTP2LF0.net] >>254 組み込みでargcとargvはどんな意味があるってんだ? コンソールがあるって前提?
257 名前:デフォルトの名無しさん (ササクッテロラ Sp81-9QlF) mailto:sage [2023/06/26(月) 13:24:00.16 ID:6bPwUIFfp.net] 意味なんて知るか ブートローダとか色々都合があるんだよ
258 名前:デフォルトの名無しさん (ワッチョイ 9dc9-3ptY) mailto:sage [2023/06/26(月) 13:31:08.91 ID:yiohjGaX0.net] 環境依存しまくってる部分だとは思うけど 組み込み用のコンパイラでも エントリは main のままなのね
259 名前:デフォルトの名無しさん (ササクッテロラ Sp81-9QlF) mailto:sage [2023/06/26(月) 13:43:40.71 ID:6bPwUIFfp.net] 組込みの真のエントリーはresetな でも普通はそこからmainまではハード会社が提供してる 初期化処理が入るからあんまり触らない
260 名前:デフォルトの名無しさん (スッププ Sdab-W+UZ) mailto:sage [2023/06/26(月) 16:47:50.70 ID:D5GxB3wJd.net] リンカにわたすオプションで_startだか_resetだかを指定してるだけ(例えばld -e _start) 自分で初期化を書きたければmakefileに先頭ラベルを記述すればいい
261 名前:デフォルトの名無しさん (ラクッペペ MM4b-d+Ca) mailto:sage [2023/06/26(月) 17:33:04.45 ID:O3f/yVVZM.net] 割込みベクタテーブルのリセット割込みのアドレスがエントリポイント マイコンのリセットでプログラムカウンタのアドレスが設定される
262 名前:デフォルトの名無しさん (ササクッテロラ Sp81-9QlF) mailto:sage [2023/06/26(月) 20:20:34.26 ID:6bPwUIFfp.net] >>260 石によるだろそんなん
263 名前:デフォルトの名無しさん (ワッチョイ 856e-gmRT) mailto:sage [2023/06/26(月) 20:39:52.87 ID:TXNTP2LF0.net] K&R Cで「死産だった」とされるentryというキーワードは、多分このへんの話だったんだろうな
264 名前:デフォルトの名無しさん (スプッッ Sd03-eK8M) [2023/06/26(月) 20:56:23.88 ID:aG57g/0Md.net] そもそもCPU(マイコン)と、そのCPUの命令セットに翻訳するコンパイラに自由度を与えるためにC言語規格で明言することを少なめにしてる 0x100からカウンタが始まるだのブートローダーが必要だの環境依存の初期化はコンパイラが知ってれば十分。
265 名前:デフォルトの名無しさん (ササクッテロラ Sp81-9QlF) mailto:sage [2023/06/26(月) 21:02:50.78 ID:6bPwUIFfp.net] コンパイラは知らないよ スタートアップライブラリが知ってる
266 名前:デフォルトの名無しさん (ワッチョイ 856e-gmRT) mailto:sage [2023/06/26(月) 21:10:49.81 ID:TXNTP2LF0.net] そそ
267 名前:デフォルトの名無しさん (ワッチョイ e3fb-eK8M) [2023/06/26(月) 21:26:51.56 ID:L7dTsKCZ0.net] ああそうかコンパイラ自体は初期化手段知らなくてもいいのね
268 名前:デフォルトの名無しさん (ワッチョイ bb2d-ctHD) mailto:sage [2023/07/07(金) 14:46:28.07 ID:Cp8NbwGm0.net] #include <stdio.h> void stack_size_estimate() { int dummy; // スタック上に確保するダミー変数 // スタック上のポインタとダミー変数の差を計算 unsigned long stack_size = (unsigned long)&dummy - (unsigned long)&stack_size_estimate; printf("Estimated stack size: %lu bytes\n", stack_size); } int main() { stack_size_estimate(); return 0; } Windowsで実行すると毎回結果がばらばらになる
269 名前:デフォルトの名無しさん (ワッチョイ e26a-3VO7) mailto:sage [2023/07/07(金) 14:52:43.24 ID:RkflWXNN0.net] .textと.bssを比較すりゃさもありなん
270 名前:デフォルトの名無しさん (ササクッテロラ Sp5f-SBEo) mailto:sage [2023/07/07(金) 15:00:57.31 ID:Rpkmzd56p.net] プログラムとデータは別れてんだよなぁ
271 名前:デフォルトの名無しさん (テテンテンテン MM8e-OS6S) mailto:sage [2023/07/07(金) 16:12:54.67 ID:h0HZTRPQM.net] アドレス空間レイアウトのランダム化 (ASLR)だろ 差じゃなくてポインターの中身を表示してみればいいじゃん
272 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 433e-hRAP) mailto:sage [2023/07/07(金) 16:20:17.47 ID:gGTaLgTI0.net] >>267 64bit 版の Windows だとしたら unsigned long はポインタを表すのに十分なサイズではない。 上位バイトが丸ごと抜け落ちて意図した計算が出来てないと思う。 へんなところを引き算するよりベースアドレスを基準に観察したほうがわかりやすいよ。 歴史的事情で Windows ではインスタンスハンドルがベースアドレスそのものということになってる。
273 名前:デフォルトの名無しさん (スップ Sd22-PY2F) [2023/07/07(金) 16:42:49.80 ID:LOYSagRvd.net] そういやlongはWindows環境だと32bitだっけか size_t使ったほうが面倒がなさそう