!extend:checked:vvvvv:1000:512
(新スレ立ての際上記コマンドを2行書き込んでください)
C言語の話題のみ取り扱います C++の話題はC++スレへ
質問には最低限の情報(ソース/コンパイラ/OS)を付ける
数行で収まらないソースは以下を適当に使ってURLを晒す
https://paiza.io/
https://ideone.com/
http://codepad.org/
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言語なら俺に聞け 156
https://mevius.5ch.net/test/read.cgi/tech/1601271690/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
探検
C言語なら俺に聞け 157
レス数が1000を超えています。これ以上書き込みはできません。
1デフォルトの名無しさん (ワッチョイ 0345-kMi9)
2021/06/28(月) 11:22:51.50ID:so+vl3vs0974デフォルトの名無しさん (ワッチョイ bfe9-4iyA)
2021/12/13(月) 03:50:46.86ID:aR9zk0xx0 >>973
あともう1点念のため。
その例 a = i++ + ++i は未定義動作になる例として適切なんだけど、未定義動作になる理由は >971 の規定であって、
>961 の「評価順序によりaに入る値が変動する場合」というような理由じゃない。
例えば a = (i = 0) + (i = 0) は、どっちの i = 0 を先に評価しても a に入る値は 0 で変動しないけど、未定義動作となる。
あともう1点念のため。
その例 a = i++ + ++i は未定義動作になる例として適切なんだけど、未定義動作になる理由は >971 の規定であって、
>961 の「評価順序によりaに入る値が変動する場合」というような理由じゃない。
例えば a = (i = 0) + (i = 0) は、どっちの i = 0 を先に評価しても a に入る値は 0 で変動しないけど、未定義動作となる。
975デフォルトの名無しさん (ワッチョイ bfe7-4DaK)
2021/12/14(火) 17:26:28.72ID:LP8Fmqr90 自作ライブラリのヘッダと標準関数のヘッダの読み込み順って
なにか決まりごとはあるの?
#include "jisaku.h"
#include <stdio.h>
ってやってたらキモイって言われたんだけど、これなんかおかしいか?
インクルードガード利いてるし順番なんてどうでもいいだろ っていうか
だったら自作のヘッダが先に来るべきだろ って思うんだけど
なにか決まりごとはあるの?
#include "jisaku.h"
#include <stdio.h>
ってやってたらキモイって言われたんだけど、これなんかおかしいか?
インクルードガード利いてるし順番なんてどうでもいいだろ っていうか
だったら自作のヘッダが先に来るべきだろ って思うんだけど
976はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 873e-8/hI)
2021/12/14(火) 18:00:24.76ID:+JRF3Q+g0 >>975
たとえば assert.h を #include する前にマクロ NDEBUG が定義されていると assert が無効になるといったように
動作の切り替えをするマクロというものが存在する。
標準ではそういうマクロは下線で始まる名前になってることが多いから自分のコードの中の名前がたまたま衝突するということは
そうそうないんだけど、各処理系やライブラリに固有の切り替え用マクロが雑な短い名前だったら意図せず影響を与えるかもしれない。
単なる習慣としてもプロジェクト内のヘッダは後に書くのが定着しているね。
たとえば assert.h を #include する前にマクロ NDEBUG が定義されていると assert が無効になるといったように
動作の切り替えをするマクロというものが存在する。
標準ではそういうマクロは下線で始まる名前になってることが多いから自分のコードの中の名前がたまたま衝突するということは
そうそうないんだけど、各処理系やライブラリに固有の切り替え用マクロが雑な短い名前だったら意図せず影響を与えるかもしれない。
単なる習慣としてもプロジェクト内のヘッダは後に書くのが定着しているね。
977デフォルトの名無しさん (ワッチョイ a720-8/hI)
2021/12/14(火) 18:01:10.76ID:la3dHmwP0 ユーザー先だと、標準的な関数やdefineが定義済みになって不具合が出るかもしれないし
一般的な方から読み込んだほうがいいのでは?
一般的な方から読み込んだほうがいいのでは?
978デフォルトの名無しさん (ワッチョイ 87bb-8/hI)
2021/12/14(火) 18:42:48.59ID:nW+wkdEb0 なんか本の著者は自作モジュールを先にインクルードするって言ってたな
理由はそのほうがコンパイルエラーが早くなるかららしい
理由はそのほうがコンパイルエラーが早くなるかららしい
979デフォルトの名無しさん (ワッチョイ bfe7-4DaK)
2021/12/14(火) 19:01:07.43ID:LP8Fmqr90980デフォルトの名無しさん (ワッチョイ 6763-xLgN)
2021/12/14(火) 19:56:33.18ID:J7XSbp4E0 コンパイルエラーが無くなってもバグは残るからなあ
981デフォルトの名無しさん (ワッチョイ 872c-N/e5)
2021/12/14(火) 21:37:05.35ID:Il/nsfIC0982デフォルトの名無しさん (ワッチョイ bfe9-4iyA)
2021/12/14(火) 22:16:45.94ID:yrIaaVQv0 >>979
決断に水を差すことになるかもしれないけど、↓のベストアンサーでは自作ヘッダが先だよ。
https://stackoverflow.com/questions/2762568/c-c-include-header-file-order
決断に水を差すことになるかもしれないけど、↓のベストアンサーでは自作ヘッダが先だよ。
https://stackoverflow.com/questions/2762568/c-c-include-header-file-order
983デフォルトの名無しさん (ワッチョイ 7f0e-4DaK)
2021/12/14(火) 22:26:46.15ID:Eg2Dauqu0 くだらねえ
単に依存関係ってだけのことだろ
一概にどっちが先であるべきだなんて押しつけは糞食らえだ
単に依存関係ってだけのことだろ
一概にどっちが先であるべきだなんて押しつけは糞食らえだ
984デフォルトの名無しさん (ワッチョイ 6763-xLgN)
2021/12/14(火) 23:19:28.66ID:J7XSbp4E0 以前のサイトだと
標準ライブラリ
業務共通ライブラリ
個別ライブラリ
の順にインクルードしなさいと決められてた
標準ライブラリ
業務共通ライブラリ
個別ライブラリ
の順にインクルードしなさいと決められてた
985デフォルトの名無しさん (ワッチョイ bfe9-4iyA)
2021/12/15(水) 00:55:34.24ID:Nn1Wh5vx0 まぁ、これも他のスタイルと同じで、どっちがいいというよりは単純なルールで統一されていることが重要なものと思ってる。
986デフォルトの名無しさん (ワッチョイ 7f0e-4DaK)
2021/12/15(水) 05:27:05.50ID:XqRMbcSJ0 押しつけはやる気と引き換えだ
そのコストに見合う理があるべき
そのコストに見合う理があるべき
987はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 873e-8/hI)
2021/12/16(木) 11:05:28.00ID:78Qrz9F+0 ヘッダのインクルードは全て .c の側でやる (ヘッダ内でインクルードしない) という流儀もある。
既にほとんど滅びた流儀だろうし、現代的ではないと断っておくがこの考え方を取るのであれば
インクルードの順序は重要になる。
// foo.h
struct foo{};
// bar.h
// ここで foo.h や stdint.h をインクルードしない
void bar(foo, uint32_t);
// bar.c
#include <stdint.h>
#include "foo.h"
#include "bar.h"
void bar(foo x, uint32_t y) { printf("bar\n"); }
// main.c
#include <stdio.h>
#include <stdint.h>
#include "foo.h"
#include "bar.h"
int main(void) { struct foo x; bar(x); }
メインの側で適切な順序にしないといけないから抽象不足だが、
インクルードガードしてても読み込んでプリプロセスの手順を通すという処理は発生してしまうので
それすらも最低限であるのが好ましいなどの思惑があるのだと思う。
(いまどきのコンパイラではインクルードガードのパターンを検出して
二度目にはファイルを読むことすらしないものもあるらしい。)
まあリソースをケチるのが正義だった昔の話やね。
既にほとんど滅びた流儀だろうし、現代的ではないと断っておくがこの考え方を取るのであれば
インクルードの順序は重要になる。
// foo.h
struct foo{};
// bar.h
// ここで foo.h や stdint.h をインクルードしない
void bar(foo, uint32_t);
// bar.c
#include <stdint.h>
#include "foo.h"
#include "bar.h"
void bar(foo x, uint32_t y) { printf("bar\n"); }
// main.c
#include <stdio.h>
#include <stdint.h>
#include "foo.h"
#include "bar.h"
int main(void) { struct foo x; bar(x); }
メインの側で適切な順序にしないといけないから抽象不足だが、
インクルードガードしてても読み込んでプリプロセスの手順を通すという処理は発生してしまうので
それすらも最低限であるのが好ましいなどの思惑があるのだと思う。
(いまどきのコンパイラではインクルードガードのパターンを検出して
二度目にはファイルを読むことすらしないものもあるらしい。)
まあリソースをケチるのが正義だった昔の話やね。
988デフォルトの名無しさん (ワッチョイ 97c3-pn1I)
2021/12/18(土) 21:34:42.48ID:U4IWqRR10 test
989デフォルトの名無しさん (ワッチョイ 37bb-g56a)
2021/12/23(木) 19:14:59.61ID:Xd/JFvMa0 レジスタから「値を読みだす」というのは「値をコピーする」と同義ですか?
990デフォルトの名無しさん (ワッチョイ a34c-ch9D)
2021/12/24(金) 05:09:46.99ID:ZnDQBfvC0 なんか違和感ある言い方だな
「読む」とはCPUへの入力、「書き込む」がCPUからの出力で
たとえばメモリリードはメモリからの出力、メモリライトはメモリへの入力を意味する
「コピー」はそれで合ってる
「ムーブ」になる場合は必ずそう断るから
「読む」とはCPUへの入力、「書き込む」がCPUからの出力で
たとえばメモリリードはメモリからの出力、メモリライトはメモリへの入力を意味する
「コピー」はそれで合ってる
「ムーブ」になる場合は必ずそう断るから
991デフォルトの名無しさん (ワッチョイ c5bb-t0J7)
2021/12/24(金) 05:42:34.84ID:TL6ByUiE0 >>990
たとえば
int a = 1;
int b = a + 2;
この「a + 2」の「a」の部分はメモリリードしてるということですよね
このとき計算のためにCPUに値を入力(コピー)しているという理解で合ってますか?
たとえば
int a = 1;
int b = a + 2;
この「a + 2」の「a」の部分はメモリリードしてるということですよね
このとき計算のためにCPUに値を入力(コピー)しているという理解で合ってますか?
992デフォルトの名無しさん (ワッチョイ 17da-zE/T)
2021/12/24(金) 05:43:27.34ID:+etymfSa0 レジスタからの読み出しは読み出しという操作自体に副作用がある(レジスタに対する読み出しを検知してデバイスが何かを行う)場合があるので, 必ずしも同義とは言えない
993デフォルトの名無しさん (ワッチョイ a34c-ch9D)
2021/12/24(金) 05:58:42.33ID:ZnDQBfvC0 >>991
合ってる
合ってる
994デフォルトの名無しさん (ワッチョイ c5bb-t0J7)
2021/12/24(金) 06:05:01.87ID:TL6ByUiE0995デフォルトの名無しさん (ワッチョイ 8d01-SPNH)
2021/12/24(金) 06:43:15.91ID:M4a7QlIa0 >>991
>CPUに値を入力
レジスタはCPUなのかメモリなのか
int a = 1;
int b = a + 2;
これがアセンブラだと
mov ax,1
add ax,2
mov ptr[b], ax
メモリに書き込んでるのは3行目しかないが
>CPUに値を入力
レジスタはCPUなのかメモリなのか
int a = 1;
int b = a + 2;
これがアセンブラだと
mov ax,1
add ax,2
mov ptr[b], ax
メモリに書き込んでるのは3行目しかないが
996デフォルトの名無しさん (ワッチョイ c5bb-t0J7)
2021/12/25(土) 01:01:40.65ID:s/Gdf1X50 >>995
アセンブラよくわからないんですが
mov ax, 1 // axレジスタに1をコピー
add ax, 2 // axレジスタの値に2を加算
mov ptr[b], ax // axレジスタの値をptr[b]にコピー
でしょうか
ptr[b]っていうのはなんですか?
アセンブラよくわからないんですが
mov ax, 1 // axレジスタに1をコピー
add ax, 2 // axレジスタの値に2を加算
mov ptr[b], ax // axレジスタの値をptr[b]にコピー
でしょうか
ptr[b]っていうのはなんですか?
997デフォルトの名無しさん (ワッチョイ eb69-e50p)
2021/12/25(土) 01:29:37.77ID:M0D5aTvU0 最適化で変数aがレジスタに充てられてるんだな
最適化を抑制すれば
mov ax,1
mov ptr[a], ax
mov ax, ptr[a]
add ax,2
mov ptr[b], ax
とかになるんじゃね
最適化を抑制すれば
mov ax,1
mov ptr[a], ax
mov ax, ptr[a]
add ax,2
mov ptr[b], ax
とかになるんじゃね
998デフォルトの名無しさん (ワッチョイ 9db3-ass7)
2021/12/25(土) 11:51:05.24ID:9FGZD56t0 #include <stdio.h>
999デフォルトの名無しさん (ワッチョイ 9db3-ass7)
2021/12/25(土) 11:51:41.94ID:9FGZD56t0 int main(void)
{
printf("good-bye 157\n");
{
printf("good-bye 157\n");
1000デフォルトの名無しさん (ワッチョイ 9db3-ass7)
2021/12/25(土) 11:52:11.17ID:9FGZD56t0 }
/*このすれは終了しました*/
/*このすれは終了しました*/
10011001
Over 1000Thread このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 180日 0時間 29分 20秒
新しいスレッドを立ててください。
life time: 180日 0時間 29分 20秒
レス数が1000を超えています。これ以上書き込みはできません。
ニュース
- 【熊本】園児に強制性交か 保育所勤務の男を逮捕「性的な欲望が我慢できなかった」警察は余罪を調べる [七波羅探題★]
- 堀江貴文、キャッシュレス非対応の店にモヤッ 『PayPay』立ち上げの人物にまさかの直談判「現金決済しかできないんだけど…」 [冬月記者★]
- 【前橋市】小川晶前市長とラブホテルで打ち合わせをした54歳男性職員を停職処分 今月末で依願退職するという [シャチ★]
- 日銀「歴史的」利上げ迫る 35年ぶりの年間上げ幅、0.5%の壁を突破 [蚤の市★]
- 【おこめ券】鈴木農相 米価維持の意図「一切ない」★3 [ぐれ★]
- 【サッカー】元日本代表DF冨安がオランダ1部アヤックスと大筋合意か 現地メディア報じる [久太郎★]
- 中国の日本向けレアアースの輸出止まる、高市のせいで日本終了のお知らせ [931948549]
- 高市早苗「竹島は日本領土」 [834922174]
- あくたんのおまんこって甘そうだよな🤤
- ヨドバシ店員「転売対策です。エヴァに出てくるロボットの名前をどれかひとつ言ってください」 [268718286]
- 🏡
- 暖房やめて湯たぼんにしようと思ってる
