!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
C23 最新ドラフト
https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3047.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言語なら俺に聞け 161
https://mevius.5ch.net/test/read.cgi/tech/1682053520/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
探検
C言語なら俺に聞け 162
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ 2389-FUJr)
2023/10/30(月) 17:13:00.82ID:hHEGE8Ol0336デフォルトの名無しさん (ワッチョイ e563-7PFe)
2024/01/05(金) 10:49:08.39ID:xgizPOi+0 その程度なら、自作できるだろう
337デフォルトの名無しさん (スププ Sd62-Blk0)
2024/01/05(金) 11:38:06.91ID:VxELzJcZd #define val abc
338デフォルトの名無しさん (スププ Sd62-Blk0)
2024/01/05(金) 12:10:00.56ID:VxELzJcZd enum { val = abc }
339デフォルトの名無しさん (スププ Sd62-Blk0)
2024/01/05(金) 12:13:38.69ID:VxELzJcZd enum の方はエラーになる
340デフォルトの名無しさん (スププ Sd62-Blk0)
2024/01/05(金) 12:27:56.38ID:VxELzJcZd #define もエラーになる
341デフォルトの名無しさん (スププ Sd62-Blk0)
2024/01/05(金) 12:30:33.41ID:VxELzJcZd #define val "abc"
342デフォルトの名無しさん (ワッチョイ 651a-R/a6)
2024/01/05(金) 12:30:55.30ID:qVR6C9yQ0 >>335
そういうのをどう解決するかを自分が考えて実現するのが楽しいのに…
自分なら
設定ファイルを「環境変数を設定する」に変更して、perlもCも環境変数から設定項目を読む に変更する。
そのために
perl側を変更する権利を得る
OSに依存して良い条件
を確保する様に、喫煙所に通う
そういうのをどう解決するかを自分が考えて実現するのが楽しいのに…
自分なら
設定ファイルを「環境変数を設定する」に変更して、perlもCも環境変数から設定項目を読む に変更する。
そのために
perl側を変更する権利を得る
OSに依存して良い条件
を確保する様に、喫煙所に通う
343デフォルトの名無しさん (ワッチョイ 651a-R/a6)
2024/01/05(金) 12:49:25.99ID:qVR6C9yQ0 >>335
別の解決案
・Cに優しい形式(右辺を全部展開した形で、イコール前後のスペースもなし)で吐き直すツールを、perlで作る
・自分で全部Cで作る
・lex/yacc を使って軽言語解釈ルーチンを作る
それぞれデメリットがあって、質問に直接答える「そういったライブラリはあるか」に一番合ってるのが、最後のlex/yaccだけど、それは一番バカらしい答えでもある。お好きに
別の解決案
・Cに優しい形式(右辺を全部展開した形で、イコール前後のスペースもなし)で吐き直すツールを、perlで作る
・自分で全部Cで作る
・lex/yacc を使って軽言語解釈ルーチンを作る
それぞれデメリットがあって、質問に直接答える「そういったライブラリはあるか」に一番合ってるのが、最後のlex/yaccだけど、それは一番バカらしい答えでもある。お好きに
344デフォルトの名無しさん (ワッチョイ 651a-R/a6)
2024/01/05(金) 12:51:00.35ID:qVR6C9yQ0 >>337
君、答える側になれる実力ないだろ
君、答える側になれる実力ないだろ
345デフォルトの名無しさん (ワッチョイ 065f-414C)
2024/01/05(金) 12:54:37.44ID:KwPCWpVD0 sscanfで読めばよかろうもん
346はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 823e-slPv)
2024/01/05(金) 13:07:45.12ID:t0UUGhQq0 >>335
その説明では何をやりたいのか伝わってないので仕様書を書いてみて。
理想的なライブラリがあったとして、そのテストケースという形式でもいい。
曖昧模糊な要望だと説明が下手なだけでなく説明しようとしている内容が見当違いな可能性を疑う。
(いわゆるXY問題)
その説明では何をやりたいのか伝わってないので仕様書を書いてみて。
理想的なライブラリがあったとして、そのテストケースという形式でもいい。
曖昧模糊な要望だと説明が下手なだけでなく説明しようとしている内容が見当違いな可能性を疑う。
(いわゆるXY問題)
347デフォルトの名無しさん (ワッチョイ 2eab-zkkm)
2024/01/05(金) 13:32:24.69ID:38bnxq2E0 Cのソースでその展開もどきを行いたいのか
Cで書いてるプログラムがとあるファイル食って文字処理するんだけど、同じことを実現したいのか
Cで書いてるプログラムがとあるファイル食って文字処理するんだけど、同じことを実現したいのか
348デフォルトの名無しさん (ワッチョイ 45bb-dhuT)
2024/01/05(金) 13:37:38.46ID:M4U6Kwpw0349はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 823e-slPv)
2024/01/05(金) 14:59:38.28ID:t0UUGhQq0 どうしても既存の設定ファイルをそのまま使いたい、それを処理できるようなものが欲しいということなら
そんな都合の良いものがあるわけない。 自分で書くしかしょうがない。
完璧にそのままのフォーマットでなくおおよそ似た機能があればよいなら
TOML とか JSON とか YAML とかの広く使われているフォーマットを採用したほうが面倒が少ない。
Perl でも C でも処理できるライブラリがいくつもあるし。
これらには変数展開のような機能はないが、
設定ファイルで動的な操作を可能にするのは問題を引き起こしやすいと考えられていて、
アプリケーション側でやるかプリプロセッサでなんとかしたほうがよい。
(強いて言えば YAML のエイリアス機能は変数のようなものとも言えるけど文字列を結合したりは出来ない。)
逆に設定どころではなくユーザーによるカスタマイズをどんどんやってもらうようなものなら
Lua とかのアプリケーション拡張言語を埋め込んでしまうという方法もとれる。
そんな都合の良いものがあるわけない。 自分で書くしかしょうがない。
完璧にそのままのフォーマットでなくおおよそ似た機能があればよいなら
TOML とか JSON とか YAML とかの広く使われているフォーマットを採用したほうが面倒が少ない。
Perl でも C でも処理できるライブラリがいくつもあるし。
これらには変数展開のような機能はないが、
設定ファイルで動的な操作を可能にするのは問題を引き起こしやすいと考えられていて、
アプリケーション側でやるかプリプロセッサでなんとかしたほうがよい。
(強いて言えば YAML のエイリアス機能は変数のようなものとも言えるけど文字列を結合したりは出来ない。)
逆に設定どころではなくユーザーによるカスタマイズをどんどんやってもらうようなものなら
Lua とかのアプリケーション拡張言語を埋め込んでしまうという方法もとれる。
350デフォルトの名無しさん (ワッチョイ c2b5-R5Zd)
2024/01/05(金) 15:39:37.20ID:mdj5x9Xd0 Perlにそんな便利機能あったっけ
351デフォルトの名無しさん (ワッチョイ c6bb-bJ3A)
2024/01/05(金) 18:09:30.90ID:xFVV62H30 Cは遅延評価を積極的にやるための言語ではないからなあ
C++やC#ならあるんだけどね
lex/yacc はちょっと古くて
今なら flex/byson ですね
C++やC#ならあるんだけどね
lex/yacc はちょっと古くて
今なら flex/byson ですね
352デフォルトの名無しさん (ワッチョイ 42ad-nK/n)
2024/01/06(土) 15:06:00.15ID:NPThFXTg0 $ の変数展開しかやらないなら複雑な構文解析にはならないから全部自作した方が楽なのでは?
少し楽したいなら perl に読ませて $ 展開させた文字列に変換して出力したのを C の側で読むとかね。そうすると少し楽ができる。
これの問題は perl が使えない環境では動かないことかな。
少し楽したいなら perl に読ませて $ 展開させた文字列に変換して出力したのを C の側で読むとかね。そうすると少し楽ができる。
これの問題は perl が使えない環境では動かないことかな。
353デフォルトの名無しさん (ワッチョイ 2ecf-9iEs)
2024/01/06(土) 16:25:37.13ID:2Gstkfh+0 今なら packcc おすすめ
354はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 823e-slPv)
2024/01/06(土) 16:27:28.51ID:iX+vez910 設定ファイルのデータ構造が key/value の組だけ、 value は単なる文字列という程度なら
パーサジェネレータはかえって邪魔じゃないのかな。
パーサジェネレータはかえって邪魔じゃないのかな。
355デフォルトの名無しさん (ワッチョイ 651a-R/a6)
2024/01/06(土) 21:36:47.69ID:8zwGVkiA0 lex/yaccは使った事ない人にはハードル高いだろうね。逆に、使い方が分かると何でもそれでやりたがる時期が来る。どんなツールや言語でもそうだろうけど
356デフォルトの名無しさん (ワッチョイ b2c2-dhuT)
2024/01/06(土) 21:39:52.15ID:YhaQaYGw0 BNF書いても大した量にならないだろうし俺ならフルスクラッチで書いちゃうな
357デフォルトの名無しさん (ワッチョイ 651a-R/a6)
2024/01/06(土) 21:45:36.68ID:8zwGVkiA0 で、設定ファイル、shで環境変数を設定すりゃ済む、という案に誰も反応してもらえないんだが、どうだい? windows ならcmdだろうけど
設定項目ってのは、パス文字列とか、メモリサイズとか、ほぼ固定だけどあとから変えたい場合もあろう、っていう定数だよね。環境変数ってまさにその目的だと思ってる。
ドル記号で一時値の展開もできる。Cからも簡単に読める。
設定項目ってのは、パス文字列とか、メモリサイズとか、ほぼ固定だけどあとから変えたい場合もあろう、っていう定数だよね。環境変数ってまさにその目的だと思ってる。
ドル記号で一時値の展開もできる。Cからも簡単に読める。
358デフォルトの名無しさん (ワッチョイ 651a-R/a6)
2024/01/06(土) 21:56:18.04ID:8zwGVkiA0 shで、設定ファイル兼、実行ファイル起動ラッパを書いて、利用者には直接実行ファイルじゃなくラッパを起動せよと説明して
export XXX_ROOT=/var/xxx
export XXX_INPUT_DIR=${XXX_ROOT}/in
export XXX_OUTPUT_DIR=${XXX_ROOT}/out
export XXX_READBUF_SIZE=32768
exec ${XXX_ROOT}/bin/xxx
Cで読む処理は
get_conf_str(...) //文字列項目用
get_conf_i64(...) //整数項目用
どっちもパラメータに
(環境変数名, 環境変数が未設定時の具体値)
って指定する。これが、ソース上の1箇所でズラッと並ぶと「設定項目名とハードコード値の、一覧表」風になるの。分かる?
export XXX_ROOT=/var/xxx
export XXX_INPUT_DIR=${XXX_ROOT}/in
export XXX_OUTPUT_DIR=${XXX_ROOT}/out
export XXX_READBUF_SIZE=32768
exec ${XXX_ROOT}/bin/xxx
Cで読む処理は
get_conf_str(...) //文字列項目用
get_conf_i64(...) //整数項目用
どっちもパラメータに
(環境変数名, 環境変数が未設定時の具体値)
って指定する。これが、ソース上の1箇所でズラッと並ぶと「設定項目名とハードコード値の、一覧表」風になるの。分かる?
359デフォルトの名無しさん (ワッチョイ 651a-R/a6)
2024/01/06(土) 22:02:36.24ID:8zwGVkiA0 get_conf_str() と get_conf_i64() の中身は
getenv() を使って簡単に実装できる、のは分かるよね?
getenv() を使って簡単に実装できる、のは分かるよね?
360デフォルトの名無しさん (ワッチョイ e1f0-P53C)
2024/01/06(土) 22:09:41.74ID:LvNnK4+W0 単なる文字列だけなら正規表現の置換でいいだろ
361デフォルトの名無しさん (ワッチョイ 651a-R/a6)
2024/01/06(土) 22:20:12.76ID:8zwGVkiA0 struct conf_t {
char* input_dir
char* output_dir;
int64_t readbuf_size;
} g_conf;
文字列項目はC++だとstd::string にする所だが、Cだとstrdup(的なもの)で実装しても良いんじゃないかい。
g_conf.inputdir = get_conf_str(
"XXX_INPUT_DIR", "/var/xxx/in");
g_conf.outputdir = get_conf_str(
"XXX_OUTPUT_DIR", "/var/xxx/out");
g_conf.readbuf_size = get_conf_i64(
"XXX_READBUF_SIZE", 32768);
とかってするとソース上で一覧表風になるでしょ。タブ文字も入れて桁そろえて。
char* input_dir
char* output_dir;
int64_t readbuf_size;
} g_conf;
文字列項目はC++だとstd::string にする所だが、Cだとstrdup(的なもの)で実装しても良いんじゃないかい。
g_conf.inputdir = get_conf_str(
"XXX_INPUT_DIR", "/var/xxx/in");
g_conf.outputdir = get_conf_str(
"XXX_OUTPUT_DIR", "/var/xxx/out");
g_conf.readbuf_size = get_conf_i64(
"XXX_READBUF_SIZE", 32768);
とかってするとソース上で一覧表風になるでしょ。タブ文字も入れて桁そろえて。
362デフォルトの名無しさん (ワッチョイ 627a-JKp6)
2024/01/06(土) 23:25:47.33ID:4fq2Cpkf0 まあ落ち着けよ 質問者はそんなこと聞いとらんだろうよ
363デフォルトの名無しさん (ワッチョイ ff7a-dvWY)
2024/01/07(日) 00:35:50.01ID:yw4Ulg6E0 for(;;){
if((result = fgets(line, MAX_LEN, stream)) != NULL){
p1=result;
p3=p1+strlen(line);
p2=strtok(p1, "=");
}
}
これで、p1とp2から左辺、p2とp3から右辺が取り出せる。
$の展開は、マクロ展開処理の要領で
右辺に$があるかチェックして、あったら定義値に置き換えるという
10ステップ程度の処理でできるだろ。
if((result = fgets(line, MAX_LEN, stream)) != NULL){
p1=result;
p3=p1+strlen(line);
p2=strtok(p1, "=");
}
}
これで、p1とp2から左辺、p2とp3から右辺が取り出せる。
$の展開は、マクロ展開処理の要領で
右辺に$があるかチェックして、あったら定義値に置き換えるという
10ステップ程度の処理でできるだろ。
364デフォルトの名無しさん (ワッチョイ 7fb5-j9I8)
2024/01/07(日) 08:57:04.03ID:4P3NNejl0365デフォルトの名無しさん (ワッチョイ 7f79-e2pS)
2024/01/07(日) 10:17:39.72ID:gAwkeLQQ0 せめて既存の気の利いた言語のstring型のメソッドやらを参考にしろよ
ここで再発明しても誰も使わんだろ
ここで再発明しても誰も使わんだろ
366デフォルトの名無しさん (ワッチョイ 5f1a-nsdu)
2024/01/07(日) 10:25:56.11ID:TVg93ufA0 質問者、もういない
367デフォルトの名無しさん (ワッチョイ df01-6482)
2024/01/07(日) 11:15:08.19ID:SfiTOIyR0368デフォルトの名無しさん (ワッチョイ 5f63-vNrU)
2024/01/07(日) 11:23:13.54ID:XrTF2oph0 動かすCプログラムをperlに書き直す方が簡単そう
369デフォルトの名無しさん (ワッチョイ 7fad-ipwt)
2024/01/07(日) 16:24:59.67ID:tTa6vFrs0 こんな方法もある。しかし $ の変数展開しかしないなら無駄な感じはするね。それだけのためにここまでするのかという。
perlembed - C プログラムへの Perl の埋め込み方
https://perldoc.jp/docs/perl/5.10.0/perlembed.pod
perlembed - C プログラムへの Perl の埋め込み方
https://perldoc.jp/docs/perl/5.10.0/perlembed.pod
370デフォルトの名無しさん (ワッチョイ 5f63-vNrU)
2024/01/10(水) 16:11:15.07ID:PVZRGcug0 $がリテラルとして入ってた時はどうするかとか、結構面倒そう
371デフォルトの名無しさん (ワッチョイ 5f1f-nsdu)
2024/01/10(水) 17:49:56.37ID:C4OEbwTl0 >>370
そうなんだよー、真面目にやるとバカみたいに面倒なのよ
文字列リテラルの中に $ やコメント開始終了記号が入る事もあるし
コメントの中に $ や文字列開始終了記号が入る事もある
# "#"
$aaa = /* $コメント " */ "文字列/**/値";
なので、頭から読み始めて、状態を追いながら(現在の場所が 文を書く所か、コメント内か、文字列内か)読まないと、正しいファイルを正しく読めない
んで、つまんないバグを作り込んだりするの。その、もういない誰かが作り込んだつまんないバグを、別の誰かが直すはめになる。そんなの嫌じゃね?
そうなんだよー、真面目にやるとバカみたいに面倒なのよ
文字列リテラルの中に $ やコメント開始終了記号が入る事もあるし
コメントの中に $ や文字列開始終了記号が入る事もある
# "#"
$aaa = /* $コメント " */ "文字列/**/値";
なので、頭から読み始めて、状態を追いながら(現在の場所が 文を書く所か、コメント内か、文字列内か)読まないと、正しいファイルを正しく読めない
んで、つまんないバグを作り込んだりするの。その、もういない誰かが作り込んだつまんないバグを、別の誰かが直すはめになる。そんなの嫌じゃね?
372デフォルトの名無しさん (ワッチョイ 5f1f-nsdu)
2024/01/10(水) 17:57:07.75ID:C4OEbwTl0 でも本当に、質問者はもうトンズラしたと思うよ。次の話をしよう
373デフォルトの名無しさん (ワッチョイ 5f63-vNrU)
2024/01/10(水) 18:00:48.10ID:PVZRGcug0 次の患者さん、どうぞ
374デフォルトの名無しさん (ワッチョイ ffcf-mfjK)
2024/01/10(水) 21:56:41.19ID:Qa3z5jue0 >>327
どっちにしろ質問者のためにやってるわけじゃないからいいんだよ
どっちにしろ質問者のためにやってるわけじゃないからいいんだよ
375デフォルトの名無しさん (ワッチョイ 5ff5-j9I8)
2024/01/10(水) 22:25:04.83ID:Gs+Ha8Nh0376デフォルトの名無しさん (ワッチョイ 7fd9-EKXI)
2024/01/10(水) 23:20:02.65ID:ZQ7M3ZpB0 ちなみにCの識別子に$を使える
少なくともgcc, clang, msvcで使える
int $val = 0;
とか
少なくともgcc, clang, msvcで使える
int $val = 0;
とか
377デフォルトの名無しさん (ワッチョイ 5f1f-nsdu)
2024/01/10(水) 23:20:30.43ID:C4OEbwTl0378デフォルトの名無しさん (ワッチョイ 5f1f-nsdu)
2024/01/10(水) 23:36:31.88ID:C4OEbwTl0 パーサー実装の現実的な話がまともにできるニキはここにはいないねw
379デフォルトの名無しさん (ワッチョイ 5f1f-nsdu)
2024/01/11(木) 02:31:42.07ID:uSDU2aBB0 ほらな、はちみつも黙るやろ
規格は詳しいけどな
規格は詳しいけどな
380デフォルトの名無しさん (ワッチョイ 5fbb-EKXI)
2024/01/11(木) 02:42:19.58ID:WTkhFxto0 パーサーなんて大して難しくないよ
テスト書けば
テスト書けば
381デフォルトの名無しさん (ワッチョイ 5fa6-j9I8)
2024/01/11(木) 06:03:54.69ID:ZajpDUJL0382デフォルトの名無しさん (ワッチョイ ffcf-mfjK)
2024/01/11(木) 07:51:37.56ID:7oF58mtI0 >>371みたいなので悩むならさくっと正規表現ライブラリやパーサージェネレータ使うな。
学習のために自分でパーサー書いてみたいってんなら別だが。
学習のために自分でパーサー書いてみたいってんなら別だが。
383はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7f3e-Cx9t)
2024/01/11(木) 09:41:05.64ID:NL5Kg7pj0384デフォルトの名無しさん (ワッチョイ 5f63-vNrU)
2024/01/11(木) 09:42:53.45ID:ZxeGb/wD0 誰か、作ってやれよ
385デフォルトの名無しさん (ワッチョイ df09-dvWY)
2024/01/12(金) 10:13:36.22ID:Umd8uX9b0 strcat() はダメなの?
386デフォルトの名無しさん (ワッチョイ ff5f-03E5)
2024/01/13(土) 00:25:52.89ID:suyQO94R0 sscanfで十分だよ
387デフォルトの名無しさん (スッップ Sd9f-j9I8)
2024/01/13(土) 09:14:54.62ID:mB7BPAPVd >>385
参加したかったの?
参加したかったの?
388デフォルトの名無しさん (ワッチョイ 5f63-vNrU)
2024/01/13(土) 09:41:46.29ID:fMrSPcrk0 ここに書けば参加したことになるよ
389デフォルトの名無しさん (ワッチョイ 5f59-P7l0)
2024/01/13(土) 13:22:56.37ID:kmNIHanh0 参加することに意義がある
390デフォルトの名無しさん (スッップ Sd9f-+zra)
2024/01/13(土) 16:53:47.66ID:8Ttuq2mzd C言語からJSON読み書きにオススメのライブラリやDLL教えてくれさい。
UTF-8↔ANSI変換はAPIでやれそうです。
UTF-8↔ANSI変換はAPIでやれそうです。
391デフォルトの名無しさん (ワッチョイ ff5f-03E5)
2024/01/13(土) 19:04:48.77ID:suyQO94R0 yyjsonで十分だよ
392デフォルトの名無しさん (ワントンキン MM16-l2AN)
2024/01/17(水) 13:51:26.07ID:MxPcwzaVM 以下はmalloc()で割り当てた領域を開放してポインタをヌルポインタにするマクロである
#define MYFREE(p) do {free(p); p = 0;} while(0)
このマクロに不備があるかないか、ある場合はどんな不備か答えよ
ただし処理系はANCI C準拠とし、stdlib.hがインクルードされていることとpが左辺値かつmallocで割り当てた領域を指す有効なポインタであることの2点は呼び出し側によって保障されているものとする
#define MYFREE(p) do {free(p); p = 0;} while(0)
このマクロに不備があるかないか、ある場合はどんな不備か答えよ
ただし処理系はANCI C準拠とし、stdlib.hがインクルードされていることとpが左辺値かつmallocで割り当てた領域を指す有効なポインタであることの2点は呼び出し側によって保障されているものとする
393デフォルトの名無しさん (ワッチョイ 427c-kX52)
2024/01/17(水) 16:32:50.55ID:sbbnyjB/0 宿題は他所でやれ
394デフォルトの名無しさん (ワッチョイ f901-LNAd)
2024/01/17(水) 19:42:28.17ID:bWv2IYcS0 do-while文で回す意味ってあるの?
395デフォルトの名無しさん (ワッチョイ c563-LNAd)
2024/01/17(水) 19:44:52.19ID:UA2B8Wur0 使った人に聞きなさい
396デフォルトの名無しさん (ブーイモ MM22-Nr/L)
2024/01/17(水) 19:49:06.18ID:dYqrLAA4M >>394
セミコロンをつけさせるため
セミコロンをつけさせるため
397デフォルトの名無しさん (ワッチョイ 25bb-ggGG)
2024/01/17(水) 21:11:00.53ID:DTNbW1I/0 >>392
答えわかったけど教えない
答えわかったけど教えない
398デフォルトの名無しさん (ワッチョイ 72cd-Qz6p)
2024/01/17(水) 21:21:33.14ID:Am4HUjmg0 >>394
2つ以上の文をマクロ関数の形にするときに、C言語の仕様において最も合法安全とされるイディオムだよ
2つ以上の文をマクロ関数の形にするときに、C言語の仕様において最も合法安全とされるイディオムだよ
399デフォルトの名無しさん (スッップ Sd22-aNQv)
2024/01/17(水) 21:47:57.64ID:i5GqHIkod >>394
たとえば
#define MYFREE(p) free(p); p = 0
と定義すると
if( 条件 ) MYFREE( p );
と書くと
if( 条件 ) free(p); p = 0;
と展開されてしまいp = 0;は条件に関わらず実行されてしまう
またこの後にelse節が続くとエラーになってしまうなど不具合の原因になる
たとえば
#define MYFREE(p) free(p); p = 0
と定義すると
if( 条件 ) MYFREE( p );
と書くと
if( 条件 ) free(p); p = 0;
と展開されてしまいp = 0;は条件に関わらず実行されてしまう
またこの後にelse節が続くとエラーになってしまうなど不具合の原因になる
400デフォルトの名無しさん (ワッチョイ f901-LNAd)
2024/01/17(水) 23:38:16.60ID:bWv2IYcS0401デフォルトの名無しさん (ワッチョイ 2214-HXAs)
2024/01/18(木) 11:04:17.52ID:0zoYvNSM0402デフォルトの名無しさん (ワッチョイ 2214-HXAs)
2024/01/18(木) 11:04:49.16ID:0zoYvNSM0 >>400
396はゼンゼン関係ないんだけどホントに分かってんのか?w
396はゼンゼン関係ないんだけどホントに分かってんのか?w
403400ではないが (ワッチョイ 6e46-Y4mw)
2024/01/18(木) 12:19:02.31ID:5g03qqC30 >>402
396 と 399 は異口同音と読んでいたが、主旨違うの?
396 と 399 は異口同音と読んでいたが、主旨違うの?
404はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 423e-/YAw)
2024/01/18(木) 12:27:08.35ID:LtdZIRKJ0 >>402
ブロックではなく do / while にする理由としては関係がある。
ブロックではなく do / while にする理由としては関係がある。
405はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 423e-/YAw)
2024/01/18(木) 12:41:36.76ID:LtdZIRKJ0 二つの文が分かれてしまわないようにするだけならブロックで包めばよくて
#define MYFREE(p) {free(p); p = 0;}
と定義しておけば
if( 条件 ) MYFREE( p );
というような使い方で意図通り動作する。 問題になるのは else が付くときで、
if( 条件 ) MYFREE( p );
else foo();
みたいなことをすると
if( 条件 ) {free(p); p = 0;};
else foo();
というように余計なセミコロンが if と else の対応付けを壊してしまう。
かといって MYFREE にはセミコロンを付けない使い方をせよというのも不格好なので do / while で囲むといい感じって話。
#define MYFREE(p) {free(p); p = 0;}
と定義しておけば
if( 条件 ) MYFREE( p );
というような使い方で意図通り動作する。 問題になるのは else が付くときで、
if( 条件 ) MYFREE( p );
else foo();
みたいなことをすると
if( 条件 ) {free(p); p = 0;};
else foo();
というように余計なセミコロンが if と else の対応付けを壊してしまう。
かといって MYFREE にはセミコロンを付けない使い方をせよというのも不格好なので do / while で囲むといい感じって話。
406デフォルトの名無しさん (ワッチョイ 118f-tUOA)
2024/01/18(木) 13:15:24.78ID:hXSenRUz0 はちみつ餃子はいい加減改名しろよ、はちみつ先生によ
どんだけタメになる話すりゃ気が済むんだ
目からウロボロスだぜまったく
どんだけタメになる話すりゃ気が済むんだ
目からウロボロスだぜまったく
407デフォルトの名無しさん (ワッチョイ 02ad-6zsj)
2024/01/18(木) 13:17:33.34ID:opxINJAy0 >>392
「せよ」ってなんだよ。何様のつもりだ?
「せよ」ってなんだよ。何様のつもりだ?
408デフォルトの名無しさん (スッップ Sd22-aNQv)
2024/01/18(木) 20:39:02.28ID:r48d/DyKd #define MYFREE(p) (free(p), p = 0)
のほうが単純
のほうが単純
409デフォルトの名無しさん (ワッチョイ 427c-kX52)
2024/01/18(木) 22:45:02.99ID:twAiz/ys0 今どきのCならマクロじゃないといけない場合以外はinline使え。
410はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 423e-/YAw)
2024/01/19(金) 08:59:45.95ID:vjpbBz8R0 >>409
C の関数は多相化できない。
void* と他のポインタは相互に変換可能なんだが
void* 自体の表現や境界調整要求は環境依存なので
#include <stddef.h>
#include <stdlib.h>
inline void my_free(void** x) {
free(*x);
*x=NULL;
}
int main(void) {
int *x = malloc(sizeof(int));
my_free((void**)&x);
}
みたいなことをして正しく動作する保証はないはず。
この場合は「マクロじゃないといけない場合」だと思うよ。
C の関数は多相化できない。
void* と他のポインタは相互に変換可能なんだが
void* 自体の表現や境界調整要求は環境依存なので
#include <stddef.h>
#include <stdlib.h>
inline void my_free(void** x) {
free(*x);
*x=NULL;
}
int main(void) {
int *x = malloc(sizeof(int));
my_free((void**)&x);
}
みたいなことをして正しく動作する保証はないはず。
この場合は「マクロじゃないといけない場合」だと思うよ。
411デフォルトの名無しさん (ワッチョイ 463f-ggGG)
2024/01/19(金) 11:12:10.18ID:Wkz3Ctqj0 mallocが返すのはvoid*だし、freeが受け取るのもvoid*なのに??
保証が無かったら俺達はこれからどうすればいいんだw
保証が無かったら俺達はこれからどうすればいいんだw
412デフォルトの名無しさん (ワッチョイ c563-LNAd)
2024/01/19(金) 11:13:32.08ID:76FyHnUv0 printf("Hello, work!");
413はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 423e-/YAw)
2024/01/19(金) 11:18:44.53ID:vjpbBz8R0 >>411
void* の話じゃなくて void** の話をしてる。
void* の話じゃなくて void** の話をしてる。
414デフォルトの名無しさん (ワッチョイ 6e2a-Y4mw)
2024/01/19(金) 11:42:42.67ID:THNGxTXR0 printf("Konyanyachiwa, Sekai no Kuni kara!");
415デフォルトの名無しさん (ワッチョイ 463f-ggGG)
2024/01/19(金) 12:11:49.63ID:Wkz3Ctqj0 void**とvoid*は相互に変換可能じゃないのか?
416はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 423e-/YAw)
2024/01/19(金) 12:19:49.22ID:vjpbBz8R0 変換が可能だということと同じ表現を持つことは別という話。
int* から void* への変換は変換に関するルールだが
int** から void** への変換によって int* を void* として読もうとするのは type punning の問題。
int* から void* への変換は変換に関するルールだが
int** から void** への変換によって int* を void* として読もうとするのは type punning の問題。
417デフォルトの名無しさん (ワッチョイ 463f-ggGG)
2024/01/19(金) 12:20:09.89ID:Wkz3Ctqj0 そうなると、
int** a = malloc(sizeof(int*) * 3);
は、保証無いことになるな
俺達はどうすればいいんだw
int** a = malloc(sizeof(int*) * 3);
は、保証無いことになるな
俺達はどうすればいいんだw
418デフォルトの名無しさん (ワッチョイ 463f-ggGG)
2024/01/19(金) 12:25:31.50ID:Wkz3Ctqj0 void** a = malloc(sizeof(void*) * 3);
の方が適切だったか
これで、a[0]の読み書きが保証されないのは困るよ
の方が適切だったか
これで、a[0]の読み書きが保証されないのは困るよ
419はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 423e-/YAw)
2024/01/19(金) 12:27:15.27ID:vjpbBz8R0 >>417
繰り返すが変換の話と表現の話は異なる。
void* は全てのオブジェクトを指すポインタと相互に変は可能であることは保証され、
「malloc が返すポインタに限っては」いかなる型とも適合するように境界調整されていることが保証される。
繰り返すが変換の話と表現の話は異なる。
void* は全てのオブジェクトを指すポインタと相互に変は可能であることは保証され、
「malloc が返すポインタに限っては」いかなる型とも適合するように境界調整されていることが保証される。
420デフォルトの名無しさん (ワッチョイ 313a-xGnM)
2024/01/19(金) 12:34:27.05ID:3hcnICbb0 【AI】Googleの医療面接特化AI「AMIE」は人間よりも正確な診断が可能&患者への印象に優れるという研究結果 [すらいむ★]
https://egg.5ch.net/test/read.cgi/scienceplus/1705583722/l50
【AI】Google DeepMindが数学オリンピックレベルの幾何学問題を解けるAIを発表、人間の金メダリストに近い性能を発揮 [すらいむ★]
https://egg.5ch.net/test/read.cgi/scienceplus/1705583476/l50
【AI】大学入試共通テスト、3つのチャットAIに解かせてみたら? GPT-4はバケモノだった [すらいむ★]
https://egg.5ch.net/test/read.cgi/scienceplus/1705585402/l50
【ナゾロジー】「株価の変動を粒子の振動として理解」量子力学で株式市場の法則を読む! [すらいむ★]
https://egg.5ch.net/test/read.cgi/scienceplus/1705583580/l50
【AI】NTT、自分の分身AIを低コストで作る技術。自分の合成音声を簡単に作れる技術も [すらいむ★]
https://egg.5ch.net/test/read.cgi/scienceplus/1705583313/l50
ボイス・トォ・スカルのコアプログラムの一部は上記を統合している
https://egg.5ch.net/test/read.cgi/scienceplus/1705583722/l50
【AI】Google DeepMindが数学オリンピックレベルの幾何学問題を解けるAIを発表、人間の金メダリストに近い性能を発揮 [すらいむ★]
https://egg.5ch.net/test/read.cgi/scienceplus/1705583476/l50
【AI】大学入試共通テスト、3つのチャットAIに解かせてみたら? GPT-4はバケモノだった [すらいむ★]
https://egg.5ch.net/test/read.cgi/scienceplus/1705585402/l50
【ナゾロジー】「株価の変動を粒子の振動として理解」量子力学で株式市場の法則を読む! [すらいむ★]
https://egg.5ch.net/test/read.cgi/scienceplus/1705583580/l50
【AI】NTT、自分の分身AIを低コストで作る技術。自分の合成音声を簡単に作れる技術も [すらいむ★]
https://egg.5ch.net/test/read.cgi/scienceplus/1705583313/l50
ボイス・トォ・スカルのコアプログラムの一部は上記を統合している
421デフォルトの名無しさん (スッップ Sd22-aNQv)
2024/01/19(金) 12:39:29.69ID:S8ovIeWid 何を言ってるんだお前は案件
ポインタの中身は指す対象によってアラインが変わるが
ポインタ自体のアラインは原則一種類しかない
ポインタの中身は指す対象によってアラインが変わるが
ポインタ自体のアラインは原則一種類しかない
422はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 423e-/YAw)
2024/01/19(金) 12:51:29.04ID:vjpbBz8R0 >>421
ポインタは型ごとに異なる表現・境界調整要求を持つ可能性がある。
適合する型へのポインタ同士の場合など同じ表現・境界調整要求を持つ条件が定められているが
最後に「これ以外の型へのポインタは、同じ表現又は同じ境界調整要求をもつ必要はない」と仕様に明記されてる。
具体的な部分は処理系定義なので全部が同じ表現であることをあてにしていい環境ならそうすることは否定しなけど、
常にあてにできるわけでもない。
ポインタは型ごとに異なる表現・境界調整要求を持つ可能性がある。
適合する型へのポインタ同士の場合など同じ表現・境界調整要求を持つ条件が定められているが
最後に「これ以外の型へのポインタは、同じ表現又は同じ境界調整要求をもつ必要はない」と仕様に明記されてる。
具体的な部分は処理系定義なので全部が同じ表現であることをあてにしていい環境ならそうすることは否定しなけど、
常にあてにできるわけでもない。
423デフォルトの名無しさん (ワッチョイ 463f-ggGG)
2024/01/19(金) 13:18:44.56ID:Wkz3Ctqj0 そうは言っても、
void* p = 0;
と直接生成出来るわけで、void*は値としての意味もちゃんとある
それがvoid**にすると元に戻せる保証が無いのは仕様の不備だろw
void* p = 0;
と直接生成出来るわけで、void*は値としての意味もちゃんとある
それがvoid**にすると元に戻せる保証が無いのは仕様の不備だろw
424デフォルトの名無しさん (スッップ Sd22-aNQv)
2024/01/19(金) 13:22:00.51ID:S8ovIeWid >>422
それは「ポインタが指す対象」についての記述で
ポインタ自体にはどんな適当な値を書き込むことも可能(そのポインタを使ってアクセスすると何が起こるかわからないというだけ)
ただポインタにNULLを書き込むだけの関数になんの危険もない
それは「ポインタが指す対象」についての記述で
ポインタ自体にはどんな適当な値を書き込むことも可能(そのポインタを使ってアクセスすると何が起こるかわからないというだけ)
ただポインタにNULLを書き込むだけの関数になんの危険もない
425はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 423e-/YAw)
2024/01/19(金) 13:35:18.59ID:vjpbBz8R0426デフォルトの名無しさん (スッップ Sd22-aNQv)
2024/01/19(金) 15:18:43.59ID:S8ovIeWid >>425
そのポインタは関数への引数であり
すでにvoid*を表すものだと型は決まってるではないか
それとは別に
インライン関数で書いた場合はその場で展開されるから
void* p = 0;と書いた場合と同様にコンパイラが適切な0を書き込んでくれるんじゃないの
つまり(void**)をつけると逆に危険
my_free(&x);
でよい
そのポインタは関数への引数であり
すでにvoid*を表すものだと型は決まってるではないか
それとは別に
インライン関数で書いた場合はその場で展開されるから
void* p = 0;と書いた場合と同様にコンパイラが適切な0を書き込んでくれるんじゃないの
つまり(void**)をつけると逆に危険
my_free(&x);
でよい
427デフォルトの名無しさん (ラクッペペ MM66-Fks1)
2024/01/19(金) 16:04:16.95ID:dJaf/W/GM ポインタで0リテラルだけは特殊でNULLと同義だったのではなかったっけ
428はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 423e-/YAw)
2024/01/19(金) 16:16:34.10ID:vjpbBz8R0 >>426
> (void**)をつけると逆に危険
これは暗黙に型変換されることが保証される文脈ではないので付けなければコンパイルが通らないだけ。
(コンパイラによっては黙って通すことはあるのかもしれない。)
> インライン関数で書いた場合はその場で展開されるから
言語の意味論としてはインライン関数は
・ 同じ定義なら (翻訳単位を跨いだ場合でも) 複数回定義してもよい (定義が一回の場合と同じ挙動)
・ なるべく高速に呼び出して欲しいことを期待するヒントである (実現方法は規定しない)
ということになってる。
インライン関数がインライン関数ではない関数と異なる動作にはならない。
> (void**)をつけると逆に危険
これは暗黙に型変換されることが保証される文脈ではないので付けなければコンパイルが通らないだけ。
(コンパイラによっては黙って通すことはあるのかもしれない。)
> インライン関数で書いた場合はその場で展開されるから
言語の意味論としてはインライン関数は
・ 同じ定義なら (翻訳単位を跨いだ場合でも) 複数回定義してもよい (定義が一回の場合と同じ挙動)
・ なるべく高速に呼び出して欲しいことを期待するヒントである (実現方法は規定しない)
ということになってる。
インライン関数がインライン関数ではない関数と異なる動作にはならない。
429はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 423e-/YAw)
2024/01/19(金) 16:39:47.61ID:vjpbBz8R0 >>427
せやで。
厳密に言えばリテラルだけじゃなくて「整数の 0 であるような定数 (定数式) をポインタに型変換したときは空ポインタ」というルール。
これも変換に関するルールであって表現に関するルールではないよね。
実際に空ポインタの内部表現が整数の 0 というわけではない環境は存在するが、
型が正しければ適切に変換される。
せやで。
厳密に言えばリテラルだけじゃなくて「整数の 0 であるような定数 (定数式) をポインタに型変換したときは空ポインタ」というルール。
これも変換に関するルールであって表現に関するルールではないよね。
実際に空ポインタの内部表現が整数の 0 というわけではない環境は存在するが、
型が正しければ適切に変換される。
430デフォルトの名無しさん (ワッチョイ 25bb-ggGG)
2024/01/19(金) 16:53:05.15ID:CCGmGKuQ0431はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 423e-/YAw)
2024/01/19(金) 17:02:59.57ID:vjpbBz8R0 >>430
いや、それがよく出来てて、ポインタをそういう形で条件に使うのは問題ない。
単項演算子 ! について「式!Eは,(0==E)と等価とする」というルールになっていて
等価演算子 (==) はポインタと空ポインタ定数を比較したときの結果を規定してる。
空ポインタ定数のほうをもう一方のオペランドの型に合う空ポインタに型変換するルール。
いや、それがよく出来てて、ポインタをそういう形で条件に使うのは問題ない。
単項演算子 ! について「式!Eは,(0==E)と等価とする」というルールになっていて
等価演算子 (==) はポインタと空ポインタ定数を比較したときの結果を規定してる。
空ポインタ定数のほうをもう一方のオペランドの型に合う空ポインタに型変換するルール。
432デフォルトの名無しさん (ワッチョイ 25bb-0zjl)
2024/01/19(金) 17:32:06.95ID:CCGmGKuQ0 >>431
規格書読んできたけど
6.3.2.3 値0をもつ整数定数式は空ポインタになる
6.5.3.1 式!Eは,(0==E)と等価
6.5.9 ==は空ポインタ定数をポインタの型へ型変換する
ってことか
なるほど、規格を解釈すれば!ptrは空ポインタと比較されることになるから問題ないのか
勉強になったわ
規格書読んできたけど
6.3.2.3 値0をもつ整数定数式は空ポインタになる
6.5.3.1 式!Eは,(0==E)と等価
6.5.9 ==は空ポインタ定数をポインタの型へ型変換する
ってことか
なるほど、規格を解釈すれば!ptrは空ポインタと比較されることになるから問題ないのか
勉強になったわ
433デフォルトの名無しさん (ワッチョイ 21d6-ggGG)
2024/01/19(金) 18:55:00.05ID:EWHtqHW90 NULLは処理系定義だしこの辺はややこしいよね
434デフォルトの名無しさん (ワッチョイ 463f-ggGG)
2024/01/20(土) 00:57:56.71ID:QcwVnceA0 void*の値は作成出来るけど、表現や境界調整要求は未定義とか、おかしいだろ
Cは現実に則した言語だと思ってたけど、妙な未定義だな
ちなみに、インタープリター型言語を作ったら、オブジェクトはみんなvoid*になる
void*の配列を作成したりとか普通に行われる
もはや規格とか無意味
実装がどうなってるかだけが重要だ
Cは現実に則した言語だと思ってたけど、妙な未定義だな
ちなみに、インタープリター型言語を作ったら、オブジェクトはみんなvoid*になる
void*の配列を作成したりとか普通に行われる
もはや規格とか無意味
実装がどうなってるかだけが重要だ
435デフォルトの名無しさん (ワッチョイ c2c3-IYsG)
2024/01/20(土) 10:29:05.14ID:ZDCHWjSD0 >>433
全然ややこしくないでしょ
全然ややこしくないでしょ
436デフォルトの名無しさん (ワッチョイ 02ad-L3s4)
2024/01/20(土) 10:30:19.13ID:UfD1Ji0o0 > 実装がどうなってるかだけが重要だ
もちろんその通りだけど規格上未定義なわけだから実装がすべて統一されているとは限らないわけで
その実装における「限らない」が問題なわけでしょ
もちろんその通りだけど規格上未定義なわけだから実装がすべて統一されているとは限らないわけで
その実装における「限らない」が問題なわけでしょ
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 橋下徹氏 外務省幹部の訪中受け「口だけ番長」へ痛烈指摘 「喧嘩は日本の完敗…なんとかっこ悪い日本か」 [冬月記者★]
- 習政権、高市首相への態度硬化 台湾有事発言で連日非難 中国 ★11 [ぐれ★]
- 【外国人問題】小野田紀美担当相「不法就労や不法滞在は許さない」 [シャチ★]
- 【野球】井端監督 大谷翔平、山本由伸らのWBCへの参加 「1日も早く返事ほしい」「待っててといっても、国内組が遅くなってしまう」★3 [冬月記者★]
- 経団連会長、日中は建設的対話を 経済3団体が高市首相と初会談も日中関係は話題に登らず… [BFU★]
- 東京株式市場 インバウンド関連株が下落 中国政府の渡航自粛要請で [バイト歴50年★]
- 橋下徹「口だけ番長の日本が中国に喧嘩負け。なんとカッコ悪い日本か!」高市にバチーン!✴ [153490809]
- 【高市早苗】習近平激怒か [115996789]
- 中国「高市が頭を下げて謝罪しない限り、絶対に許さない」 [329329848]
- 🏡
- ワンピースの評価ガタ落ちしてるけど尾田っちのメンタルが心配
- ガンダム←名言ばかり エバー(笑)←こいつ(笑)
