C言語なら俺に聞け 142 [無断転載禁止]©2ch.net

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん 転載ダメ©2ch.net (ワッチョイ 8a6f-bDrV)
垢版 |
2017/08/10(木) 20:21:23.44ID:hEocmkh50
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/


http://mevius.2ch.net/test/read.cgi/tech/1500293207/
http://www.geocities.jp/c_cpp_cs/about_c/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
2017/08/18(金) 23:57:54.41ID:nSj4GkNd0
>>78
>前置インクリメントa++
>後置インクリメント++a

考え方が逆
変数を基準に考えるのではなく演算子を基準に考える
前置インクリメント++a : 演算子を’前’置した場合、変数(式)の評価’前’に演算子が適用される
後置インクリメントa++ : 演算子を’後’置した場合、変数(式)の評価’後’に演算子が適用される
2017/08/19(土) 00:03:09.07ID:0xgPi4RO0
>>84
なるでしょ
iの変更と最後のiの評価の間に順序性がない事に変わりはない
87デフォルトの名無しさん (ワッチョイ ab1c-Pf/K)
垢版 |
2017/08/19(土) 09:44:47.22ID:CpINIl4e0
i = i + 1;
の、iの変更と最後のiの評価の間の順序性は?
88C言語ますたー《ますたー軍団(常時募集)の長》 ◆oa6k//3vOQ (ラクッペ MMed-UZV0)
垢版 |
2017/08/19(土) 09:54:20.36ID:6ANTyB1VM
>>87
i+1のiは変更前のiでしょ
2017/08/19(土) 10:03:42.32ID:cD3Bg7W9d
>>30
デバッグしないのか?
2017/08/19(土) 10:37:04.42ID:opyN89fo0
デバッガはデバッガで起動すればいいし、printf があるし。
2017/08/19(土) 11:26:43.49ID:0xgPi4RO0
>>87
6.5.16 Assignment operators
「The side effect of updating the stored value of the left operand is sequenced after the value computations of the left and right operands. The evaluations of the operands are unsequenced.」
左オペランドの変更は、左右オペランドの評価の後
2017/08/19(土) 12:19:31.20ID:9KU7ntuJ0
>>84
MISRA-C で、禁止されている

a[式]
この式に、副作用があったら、ダメ。
バグるから
93デフォルトの名無しさん (ワッチョイ ab1c-Pf/K)
垢版 |
2017/08/19(土) 15:28:05.17ID:CpINIl4e0
>>91
thx
だよな、そこは断り書きが必要な箇所
2017/08/19(土) 23:53:05.68ID:HeBiuDVT0
>>92
バグが入りやすい書き方ってだけでバグるわけじゃない
2017/08/20(日) 00:16:58.16ID:856Qy56L0
a[i++]= b; は問題ないしな。
96デフォルトの名無しさん (ワッチョイ 6123-WxsM)
垢版 |
2017/08/20(日) 03:47:32.99ID:+c5k6kJk0
右辺の結果を出してから左辺の計算やってるようだな。
https://paiza.io/projects/G_durt7YVnR55npMvUcKwg
2017/08/20(日) 06:41:37.88ID:6XW1JaY/0
http://i.imgur.com/BmPLoWb.png
98デフォルトの名無しさん (ワッチョイ ab1c-Pf/K)
垢版 |
2017/08/20(日) 09:25:38.38ID:sGdhnhOm0
事実上どうなっているという話ではなく
理屈の上でどうなのかという話
ちゃんと断り書きがあったからめでたしだが
そうでなかったら大変だった
2017/08/20(日) 09:58:54.27ID:SbUj3AhWM
>>76
ありがとう
ちょっとmake読んでくる
2017/08/22(火) 11:22:32.57ID:chgkyZKA0
defineした定数を文字列定数にいれるにはどうしたらいいの?

#define EOL 0x0d

const char version_message[] = "Version 1.0\x0d"

↑この文字列の改行コードに定数EOLを展開した値を入れたいです。
2017/08/22(火) 11:44:36.20ID:xXPB4eWM0
>>100
https://ideone.com/LeNUGK
102デフォルトの名無しさん (エーイモ SEf3-Ufa9)
垢版 |
2017/08/22(火) 11:47:40.32ID:przmPyd7E
typedef struct hoge {
int a;
int b;
} hoge;

hoge h = {1, 2};

構造体に含まれるメンバ名と値を全て出力する方法を教えてください
上の構造体なら
a,1
b,2
と出力したいです
2017/08/22(火) 11:59:42.09ID:GCxyf0Da0
>>100
小さな部品を繋いで大きなものを得るのはとても簡単にできるけど
部分を削って小さな部品を得るのはとても大変なのよ
だから本来は改行文字は機能的にレイアウトなのでデータとは分離しておいて
表示なりなんなりするときに結合して使うのが望ましいもちろんVersionと数字もね

その上で既存コードのメンテ等でどうしても必要なら>>101がベスト
2017/08/22(火) 12:08:53.86ID:R9ds2cCvH
>>100
#define EOLSTR "\x0d"
const char version_message[] = "Version 1.0" EOLSTR;
2017/08/22(火) 12:11:18.37ID:xXPB4eWM0
>>104
それは迷ったんだよねー
次点でその文字列をマクロで作ることも考えたけどあかんかったw
2017/08/22(火) 12:14:35.93ID:GCxyf0Da0
>>102
変数名はあくまで人間が扱いやすいように何らかの領域(一般的にメモリアドレス)に付けるあだ名であって
プログラム(コンピュータ)的にはメモリアドレスのほうが扱いやすいのであだ名は不要(アドレスのほうはプログラム的に出せる)
なのであだ名のほうが欲しいなら以下のように直書きするしかない
printf("%s,%d\n", "a", h.a);
107デフォルトの名無しさん (エーイモ SEf3-Ufa9)
垢版 |
2017/08/22(火) 12:52:42.46ID:przmPyd7E
>>106
そうなんですか・・・
全部直書きするのキツイのであだ名がなくてもかまわないのでこの場合の方法ないでしょうか?
2017/08/22(火) 13:00:37.52ID:u9fcDp43H
デバッグ目的ならデバッガで
2017/08/22(火) 13:20:20.96ID:chgkyZKA0
>>101,104、ありがとうございます、

PCとUSBシリアルで通信する組み込み機器のドライバをメンテしていて
受信したテキストの終端検出にEOLはキャラクタで扱っているし
送信する固定テキストは改行含めてリテラルにしたく
プリプロセッサの#か##で連結でなんとかできないか悩んでました。
2017/08/22(火) 13:21:07.96ID:bF0tRsYk0
コンパイルしたらメンバー名と型の情報は消える
111C言語ますたー《ますたー軍団(常時募集)の長》 ◆Cmaster.sY (ラクッペ MMed-UZV0)
垢版 |
2017/08/22(火) 15:44:32.04ID:tfXVsICTM
メモリアドレスを出力させればいいんじゃない?
%pで&aを表示できるはず
2017/08/22(火) 16:43:27.00ID:xXPB4eWM0
与えられた変数から、メンバ名とその値を再帰的に列挙して欲しいんだろうけど
そんな都合の良い言語じゃないから自分で並べるしかない

必要に応じて毎回並べるか
並べて出力したものを関数化しといてそれを呼び出すか
113デフォルトの名無しさん (ワッチョイ ab1c-Pf/K)
垢版 |
2017/08/22(火) 17:44:12.68ID:NIldwpVs0
再帰的に列挙は自動だととんでもない情報量になったりするからな
そこから欲しい情報をどうやって抜き出すかが頭の使いどころ
2017/08/22(火) 22:53:39.27ID:YwU2BQ/U0
>>100

#include <stdio.h>

#define EOL x0a
#define _STRING(s) # s
#define STRING(s) _STRING(s)
#define _VALUE(s) 0 ## s
#define VALUE(s) _VALUE(s)

char a[] = "Hello" STRING(\EOL);

void main(void) {
int n;

n = VALUE(EOL);
printf("%02x [%s] \n", n, a);
}
115デフォルトの名無しさん (ワッチョイ 6123-oL0b)
垢版 |
2017/08/22(火) 22:53:45.07ID:hpqXPKX70
>>107
マクロでちょっと簡略化することはできる。ちょっとだけな。
https://paiza.io/projects/dRqn0XFnjDUUmr5_5AzF2A
2017/08/22(火) 22:56:32.37ID:hpqXPKX70
あ。もうちょっとできたので今修正した。
2017/08/22(火) 23:26:16.15ID:bF0tRsYk0
>>115
これってさ、メンバ名をconst char*にするんだよね?
2017/08/22(火) 23:41:21.22ID:D8nSL4rC0
>>115でいいと思うけど、
そもそもこれがしたい場合にC言語を使うのが間違いでしょ。
動的言語かリクレクションがある言語を使えばいいだけ。

ちなみにVC++/CLIでよければリフレクションが使えるけどね。
質問者には無理だろうけど。
レベルからいって>>108が当たりだろうね。
2017/08/23(水) 00:06:55.83ID:b0JJUPNx0
>>117
#x の所? そうじゃないかな。gcc -E とかやって見てみるとわかると思うが、 h.a は単純に "h.a" になっている。

>>118
C使わなきゃいいってのはその通りだが、それを言っちゃあお終いよ。
2017/08/23(水) 00:14:59.00ID:PJzK0CC4M
構造体のメンバ名がほしいとかデバッグ以外に何があるの
2017/08/23(水) 00:22:23.00ID:CuDbJhab0
>>120
有名どころはGUIのバインディング。
例えばWPFは自動的にリクレクションを使ってこれをやってくれる。詳細は以下参照。
http://www.atmarkit.co.jp/ait/articles/1010/08/news123.html

ただ、Cのアプリでこれは要らんし、今時生CでGUIもないよな?
2017/08/23(水) 06:05:17.73ID:x0fRL5lg0
テキストベースで構造体の値のファイルへの保存と読み込みをしたいのかな
123デフォルトの名無しさん (ワッチョイ 09e4-xjvb)
垢版 |
2017/08/25(金) 05:26:20.30ID:vC6ff47f0
マクロでどうにかできるかとも考えたが壊れる対処のし様がない

#define pr(a,b) printf(pr_##a(b))
#define pr_test_t(b) "#b{i:%d,s:%s}", (b).i, (b).s
typedef strct{int i; char *s;}test_t;

pr((test_t){.i=999; .s="abc"});
2017/08/25(金) 05:30:42.91ID:hNG5yKqv0
Cはウンコ言語なのでリフレクションはありませんの一言で終わる質問
2017/08/25(金) 08:26:26.12ID:degYWVoy0
C言語はもう 気ままにリフレクション
2017/08/25(金) 08:28:37.56ID:+VfvF6y6d
>>124
うんこじゃない言語もコンパイラはうんこ言語(お前に言わせるとC言語)でつくられてるけどな
2017/08/25(金) 08:31:15.05ID:mWX/padLd
本当にうんこならとっくの昔に消えてるよ
128デフォルトの名無しさん (ワッチョイ c61c-9BKz)
垢版 |
2017/08/25(金) 15:42:32.73ID:RGmsOxnq0
Cはうんことかほざくやつ
まさかLinuxなんか使ってねえだろな
2017/08/25(金) 17:02:40.42ID:mWX/padLd
linuxはうんこ
2017/08/25(金) 17:44:02.80ID:GY4pXB3S0
Cがウンコとか言ってる奴に限ってRubyでしか書けないとかいうオチだったら笑えるんだけどな
2017/08/25(金) 21:36:12.81ID:BZOsNf+t0
高級アセンブラ最高じゃん
2017/08/25(金) 22:36:16.04ID:+VfvF6y6d
>>131
ほんそれ
2017/08/25(金) 22:45:39.22ID:IHFV3+gX0
むしろ Ruby で自由にコードを書ける人を尊敬する今日この頃。
最近やってるんだけど、どうしても馴染めない。普通には組めるけど、違和感が残るというか抵抗があるというか。
2017/08/26(土) 00:06:54.39ID:F7j6CSPU0
リフレクションを使う気がなければリフレクション自体がウンコだよ。
・ソースコードがだだ漏れ
・実行体が無駄に膨らむ(ソースコード情報を含むため)
・リクレクションが必要な用途なら、動的言語でついでに型無しの方が断然楽

GUIとかね。
ウンコと言われ続けたJavaScriptを誰も殺せず、
ついにはElectronとか言い出してデスクトップ側にも進出してきてるだろ。
やれば分かるがGUIに関しては動的型無しHTML(=JavaScript)は最強。

C言語はC言語が目指した範囲での仕様は美しいよ。
ただそこには今後ともリクレクションは必要ないね。
唯一引っかかるのは>>122か。

>>133
どの辺が?
俺はRuby使いではないが、それよりも酷いとされるJavaScriptには馴染んでしまったから、
ある程度は答えられるかも。
135デフォルトの名無しさん (ワッチョイ 09e4-xjvb)
垢版 |
2017/08/26(土) 00:48:52.34ID:acOQPPj10
lua等の組込み言語とやり取りする container生成用補助構文群が有ってもいい
関数では前方宣言とか scopeが邪魔して対処しきれないだろうから
うまくすれば文字列操作表示も標準libraryから追い出せる
136デフォルトの名無しさん (ワッチョイ 09e4-xjvb)
垢版 |
2017/08/26(土) 00:52:27.30ID:acOQPPj10
pr(test_t, (test_t){.i=999; .s="abc";});
2017/08/26(土) 14:20:33.57ID:rkE5GYva0
>>134
javaでアノテーションいじり始めるとリフレクションまじ便利で欲しくなるけど、c系にはなくてもいいかなというのも思う。

テバグ目的ならgdbでいいしな。
2017/08/29(火) 00:26:03.40ID:+Y8D6iZy0
>>134
規模が大きい場合は型があって静的に検査できるほうが便利だねというのが世間の流れだと思うが
TypeScriptとかFlowとか
速度を稼ぐ目的でwasmも今後主流になっていくだろう

巨大ストレージ、OSSが主流な時代にメタデータのサイズやソース隠蔽は気にしなくなったし
2017/08/29(火) 02:58:14.41ID:Uz0lh6nE0
>>138
> 規模が大きい場合は型があって静的に検査できるほうが便利だねというのが世間の流れだと思うが
違うね。今の流れは「選べる」だ。つまり、
・型無し言語に型情報を付加し、恩恵を受ける---TypeScript
・型あり言語に型推論やジェネリックを追加し、型情報を記述する煩わしさを回避---C#/C++/Java
どっちも出来ることはほぼ同じ。ほぼ全ての言語がここを目指してるでしょ。(Cを除く)
要するにいいとこ取りを目指しているわけで、自然な流れだ。
型があった方が助かるのなら書け、煩わしいだけなら書かなくて済む、という方向に進化しつつある。
なお、GUIに関しては型無しでも大して苦労しない。バグっているかどうかは見れば分かるから。

> 速度を稼ぐ目的でwasmも今後主流になっていくだろう
ならんと思うし、C使いにとってはなったとしてもああそうですか、でしかないと思うが。

> 巨大ストレージ、OSSが主流な時代にメタデータのサイズやソース隠蔽は気にしなくなったし
OSSについては歪んでいて、本来は選べるべきだよ。
JavaScriptのようにソース曝露必須というのは問題ではある。

富豪どころか大富豪プログラミングを自由に出来る時代ではあるが、
何だかんだで速度=バッテリの持ち/快適さなので、実際は、「気にしなくていい環境も増えた」だよ。
とはいえCレベルでのチューニングが必要なこともそうないが。
2017/08/29(火) 07:49:01.20ID:pPJ906sN0
>・型無し言語に型情報を付加し、恩恵を受ける---TypeScript
>・型あり言語に型推論やジェネリックを追加し、型情報を記述する煩わしさを回避---C#/C++/Java

後者は型を明示的に書かなくてもいというだけで最初からすべて型検査してるぞ。
型検査について言えば、動的型付け言語に静的な型検査を導入する流れはあるが逆はない。
2017/08/29(火) 08:29:00.57ID:E7mhir0G0
動かす前にバグが見つかる仕掛けがちゃんとあるなら
動的型付けでも構わんよ
2017/08/29(火) 14:42:19.23ID:/UmWkn6m0
無理ゲーっぽくね?
2017/08/29(火) 14:47:49.09ID:/UmWkn6m0
んなことはないみたいだぬ
2017/08/29(火) 18:55:09.32ID:qEt/+AkhM
100%は無理
そこそこなら行ける
2017/08/29(火) 20:04:11.09ID://zGX0GI0
option explicit +中間言語コンパイル,なら使えそうだ
2017/08/29(火) 22:43:29.12ID:Uz0lh6nE0
>>140
> 型検査について言えば、動的型付け言語に静的な型検査を導入する流れはあるが逆はない。
これは事実としてはその通りだが、理由はこれが型あり言語の正義だからであって、
現実は型検査がウザイだけの時も多いだろ。
C++のtemplateとか、varで書いたら勝手にtemplate化してくれ、という場合も多い。
込み入ったことをやるとコンパイルを通すだけの為に苦労したりするが、
あんなのは完全に時間と手間の無駄だ。
また、他でもよく言われているが、確かに関数ポインタを常用し始めた場合、
型あり『しか出来ない』言語は壮絶にウザイ。どうでもいい型が氾濫するだけだし。

言語として出来る/出来ないではなく、
ユーザーがやりたい時には出来る/やりたくない時には切れる、が正解なんだよ。
型無し言語はこれを認めていて、欠点を修正し始めてる。
型あり言語はこれを認められず、まだ自分たちの正義(型検査は必須)を押し売りしてるだけ。

C(と言うかC++)ではconstがこの状況に近いのではないかな?
通説ではconstは付けるべき、となっているが、俺は付けてない。理由は、
・そもそも俺はconstで苦労したことがない(必要性を感じない)
・中途半端に付けてると余計に面倒になるだけ
・const_castとか、ただの馬鹿としか思えない
なんだが、同様の意見の奴もある程度はいるだろ。
過剰な型検査ってのはあるんだよ。それが人によって異なるってだけで。
やればいいって物ではない。
2017/08/29(火) 22:56:30.74ID:pPJ906sN0
なんだ?>>139の「違うね」ってのは現状認識が違うって話じゃなくてあんたの理想と違うってことか?
そりゃ正解はあんたにしかわからんわ。
2017/08/29(火) 23:14:00.57ID:Uz0lh6nE0
>>147
現状認識も間違っていると思うけど。
日本語が不自由ならさようなら。

そもそも「型検査」が欲しいわけではなくて、静的チェックが欲しいだけなんだよ。
君は最初からずれている。>>141が正しい。
149デフォルトの名無しさん (ワッチョイ c61c-9BKz)
垢版 |
2017/08/29(火) 23:17:01.52ID:/SLQJmZn0
> コンパイルを通すだけの為に苦労したりするが、
> あんなのは完全に時間と手間の無駄だ。

そうだねえ
自分の考えがはっきりしてなくて筋が通らないのを
コンパイラに突っ込まれ、そのたびに右往左往じゃ
下手の考え休むに似・・いや如かずってやつ
2017/08/29(火) 23:31:56.37ID:pPJ906sN0
「今の流れってこうだよね」
「俺の欲しいものは違う」

会話にならねぇ。
2017/08/29(火) 23:53:00.65ID:Uz0lh6nE0
>>150
そうとしか取れないのは君が未熟だからだね。

「流れ」ってのは原因ではなく、大多数が希望した「結果」なんだよ。
君は初心者だから、毎日コード書いている連中が何を求めているのか分からない。
それだけだね。
2017/08/29(火) 23:57:29.58ID:+Y8D6iZy0
>>139,146
>GUIに関しては型無しでも大して苦労しない。バグっているかどうかは見れば分かるから。
見てわかる程度の規模の場合は型無しでもよいだろうね

>型検査がウザイだけの時も多いだろ
どんな時?C#には動的に型解決するdynamicがあるけどほとんど使わないな
COM除けばJSONやXMLの処理で楽するときぐらい?それでも本番用ならちゃんと書くなぁ

>どうでもいい型が氾濫
ジェネリックで型指定するだけだから氾濫しなくね?

あと、constはプログラマーがミスを防ぐためのものであると同時にコンパイラーへのヒントでもある
const修飾されていれば大胆な最適化が可能な場合も多い
2017/08/30(水) 00:01:54.97ID:3iEZIBUv0
>>151
俺も>>150と同じように読めた。
自分の希望を大多数の希望だと決め付けるのは止めろよ。
2017/08/30(水) 00:53:26.35ID:F1WQhw000
>>152
> >GUIに関しては型無しでも大して苦労しない。バグっているかどうかは見れば分かるから。
> 見てわかる程度の規模の場合は型無しでもよいだろうね
規模にかかわらず、見ずにチェックするGUIなんて無いだろ。

> どんな時?C#には動的に型解決するdynamicがあるけどほとんど使わないな
おー、C#はやはり進んでいるというか、痒いところに手が届いているね。

要するに楽をさせてくれでしかないのだが、ぱっと思いつく遭遇したケースは、
・callbackでdelegateの型チェックがウザイ。グダグダ言わずにcallbackしてこい。
・リフレクション時がかなり最悪。(C#なら問題ないが、
VC++2008とかだと、MSDNで型を調べながら型を書くという本末転倒の事態になる)
以下にはJSONガーとか書いてあるけど、JSONをC++で受けたことはないので実感はない。
http://ufcpp.net/study/csharp/sp4_dynamic.html#what
後は型無しだとデタラメなパッチが可能だというのもあるし、俺は常用してるけど、
これ自体はあまり推奨されることではないね。

俺はJavaScriptで型をかかないことに慣れてしまったので、
再びVC++で型を書く時にウザくて仕方ない。
(ただしこれはVC++しかやってない時には全く感じなかった)
要するに型情報は具ではなく、ただのチェック用付加情報でしかないんだよ。
例えれば、当たり前に読める漢字にもいちいち全部ルビを付けている感じか?二度手間がウザイ。
ただし二重チェックをしたい部分もあるので、そういうところは書かせろ、とも思うが。
コンパイラにプログラマが合わせるのではなくて、プログラマにコンパイラが合わせるべき。

> ジェネリックで型指定するだけだから氾濫しなくね?
C#は多分そうだね。C#では解決済みかも。

> const修飾されていれば大胆な最適化が可能な場合も多い
この説はよく聞くが、具体的にどういうケースよ?
2017/08/30(水) 00:58:09.18ID:ry+Kms2n0
>>141
こういうやつってユニットテストしらないのか?

Cでも今時は書くだろ
2017/08/30(水) 01:17:46.58ID:ry+Kms2n0
型どうこうで考えるべきは依存関係なんだが

静的型言語はすぐに依存関係ができる
そのためにやれ継承だのインタフェースだのデザパタだのとごちゃごちゃ考えなきゃならん

しかもデザパタで実現できる疎結合は完全じゃないからね
2017/08/30(水) 01:56:29.11ID:F1WQhw000
>>156
それは型ではなくてラムダの利点だと思うが。
ただ、ラムダを積極活用すると型が邪魔だってのはあるし、
結果的に関数型が型無しor型推論に突き進んだのはこれが理由だと思うが。

しかもデザパタって使い物にならんだろ。
というか元々Javaという関数ポインタもラムダもない言語で(キリッされても、
他の言語ならもっとマシに出来るんじゃね?ってのが多いというか、
なんで縛りプレイに付き合わないといけないの?っていうか、
だいたい説明自体もイミフなのが多いし。
2017/08/30(水) 02:00:40.60ID:vF4qFgfn0
>>154
コンポーネントとかイベントの引数の型を間違えたり変更時に修正漏れが出たりはよくあるでしょ

>callbackでdelegateの型チェックがウザイ
async/awaitがある言語だとコールバックを使うことはあまりないしなぁ
どういうのを望んでるのかよくわからんが、型安全と最適化を投げ捨ててまでやることには見えん
コールバックの処理が適切なことはテストとかで保証するとか考えるとそっちが面倒そうに見えるが

>リフレクション時がかなり最悪
VC++でリフレクションって、どの話だ

>チェック用付加情報・二度手間がウザイ
どうせドキュメントとかテストに書いてくんだから二度手間は避けられん
定義が面倒な分、静的型言語では戻り値の型やメンバーが即座に確実に補完されるので非常に快適
全参照を書き換えるリファクタとかもできるし

新しい言語はそこら辺かなり解決されてる
2017/08/30(水) 02:07:48.34ID:ry+Kms2n0
>>157
酔ってんのか?Java?意味不明だ

レス付けるなら何を話してんのか特定しろ
2017/08/30(水) 02:25:01.52ID:vF4qFgfn0
>>154
constはどちらかというと、x + y = zみたいな変な呼び出しを禁じたいからつけてるから、最適化についてはパッとでは極端な例しか思いつかんな・・・
hoge(&a,&b);
c = a + b
でhogeの引数がconstなら処理を無視してa+bを静的に確定できるとか

根本的にC++は「型安全とバイナリの性能>>>楽をしたい」という発想の言語だから静的な型の確定を妨害するような機能は理念に反するでしょ
javascriptにポインタが欲しいぐらいの不自然さ
2017/08/30(水) 06:22:36.60ID:dAnuHQ8p0
早く夏休み終わらないかな…
2017/08/30(水) 07:01:40.06ID:AqkMSzAW0
いや終わらなくていいよ
電車混むし
2017/08/30(水) 08:10:07.81ID:Li+Lo8rKd
大学生のは未だ続くで
164デフォルトの名無しさん (エーイモ SEb2-dmBu)
垢版 |
2017/08/30(水) 13:51:14.27ID:AB0hyKA3E
すいません
Windowsでvirtualboxとかcygwinとかmsysみたいな名前のをインストールする予定はないんですが
WindowsでCを書く場合はVC++を使うのが定番なのでしょうか?
gccとclangを使うのはあんまりおすすめしないですか?
2017/08/30(水) 13:58:51.95ID:1qHN72hha
GUIないならgccでも問題ない
166デフォルトの名無しさん (ワッチョイ c61c-9BKz)
垢版 |
2017/08/30(水) 14:33:39.82ID:BJd10UjW0
GUIあってもgcc使えるぞ
gcc your_program.c -luser32 -mwindows

-luser32ってのがインポートライブラリuser32.libを使う指定な
他に色々kernel32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.libなんかがいるんで適宜追加しる
2017/08/30(水) 18:06:52.31ID:S+MvNVsbM
Windows版のgccある?
168デフォルトの名無しさん (ワッチョイ c61c-9BKz)
垢版 |
2017/08/30(水) 18:24:32.41ID:BJd10UjW0
たとえばこんなのか?
https://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win64/Personal%20Builds/mingw-builds/
2017/08/30(水) 18:31:00.76ID:S+MvNVsbM
mingw 入ってない環境だとバイナリ使えないよね。
コンパイルして実行したいだけなのに。
2017/08/30(水) 18:43:05.43ID:LRl1+/WB0
実行ファイルの配布の意図?
mingwでコンパイルできれば、実行もできる環境が整ってるんじゃないの?
2017/08/30(水) 19:17:06.22ID:58Rp2mqQ0
>>169
よくごっちゃにしてる人がいるけどそれはcygwinを使う場合
mingwはランタイムにmsvcrtを使うのでcygwin1.dllは不要
172デフォルトの名無しさん (ワッチョイ c61c-9BKz)
垢版 |
2017/08/30(水) 19:17:51.85ID:BJd10UjW0
あのなー・・・
cygwinがそういう批判を受けていたのを踏まえて
「本当のミニマリスト」を目指したのがmingwなんだよ
それすらいやなら、あとはM$純正のbashくらいだぞ
173デフォルトの名無しさん (ワッチョイ 0951-TBjh)
垢版 |
2017/08/30(水) 19:21:14.37ID:qx/wlZ6S0
https://www.youtube.com/watch?v=VzylWELlUy4
2017/08/30(水) 20:36:36.61ID:ViOUv0iA0
>>167
The Perl for MS Windowsって言うのがある。
これインストールすると、gccも入る
普通にコマンドラインで使える

http://strawberryperl.com/
175デフォルトの名無しさん (ワッチョイ c61c-9BKz)
垢版 |
2017/08/30(水) 20:41:41.90ID:BJd10UjW0
>>168だって本当に最小限のmingwが黙って入るから意識せずに使えるぞ
で最小限じゃないmingwが欲しくなったらmsys2とか入れるんだよ
2017/08/30(水) 20:52:42.57ID:t1uAI5x90
こういう枝葉でゴチャゴチャやるぐらいなら、さっさとVC入れたほうが良い
windowsで開発するなら、VCさえあれば十分
2017/08/30(水) 21:46:54.45ID:1xtdX2a20
コンソールアプリくらいならgccでコンパイルできても良さそうなもんだけどな。

関係ないけど .NET に JS コンパイラが入ってるの知らなかった。
2017/08/30(水) 22:05:25.61ID:AIW55pOFM
>>168 >>171
知らなかったです。
いいですね、MinGW
2017/08/30(水) 23:02:07.68ID:F1WQhw000
>>158
> 引数の型を間違えたり変更時に修正漏れが出たり
ねえよ。正確に言うと、『これが型検査で都合よく引っかかるのは』ねえよ。
型があってコンパイル時に落とせるのは明確なtypoだけで、それ以外は期待出来ない。
xxxx2とxxxx3とかを間違えた場合、通常、型は同じでしょ。

ただそれ以前にJavaScriptだと修正漏れ自体がないっつうか、修正しなくていいというか。
型検査は基本的にソース全体で辻褄が合っているかを検査する。
だから例えば機能追加で関数の引数が増えた場合、コンパイラは修正漏れを全て検出し、修正を促してくる。
ところがJavaScriptにはそういう機能はないから、漏れてしまう、というのがそちらの意見だと思うが、
そもそも漏れても動作するように作られてるから問題ない、というのがJavaScriptの思想。
具体的には、
・同じ関数が引数の数が違っても呼べるから、エラーにはならない。(引数の型/個数はシグニチャに入らない)
・足りてない引数は、undefind(falsy)になっているから、if (addedParameter) で簡単に対応出来る。
だから修正するパス(その機能が追加される動作パス)の部分だけ修正して、後は放置で問題ない。
もちろんこれだとソース内で引数の数の一致なんて無くなってしまう。
これでいいのか?とも思うが、俺が試した範囲では特に問題はなかった。

C#はIDEがいいから、全ソースをリファクタとかも簡単に出来るようだ。これはこれで一つの完成形だ。
そうではなく、手修正だと漏れる、だからコンパイラがそれを検出する、というのも一つの手だが、(C++)
漏れる漏れない以前に、関係ないところは修正の必要がそもそも無い、というのも一つの手だよ。(JavaScript)
ちまちま全修正するのが面倒だし危険だから、
受け側で引数違い毎にラップ(オーバーロード)してたらなんだかなぁ(俺的C++)、
みたいなのとは発想が逆だった。
2017/08/30(水) 23:03:09.90ID:F1WQhw000
async/awaitはJavaScriptにもあるが、あれはC#とかで必要なのであって、JavaScriptでは要らないね。
理由は、
・外側関数(上位階層)の変数は全部クロージャになっていて読み出せる。
・関数はどこにでも書ける。
から。C的に関数毎に変数が完全に分離している時にはasync/awaitでないと変数が共有出来ないけど、
JavaScriptの文法だとcallbackでも変数共有出来るから、要らん。具体的には、文法は適当だが、
function someTask {
var x = xxx;
var a = await funcA(x);
var b = await funcB(a,x);
}
みたいなのを、
function someTask {
var x = xxx;
var a, b; // 共有変数は上位で宣言しておく。これでクロージャから捕捉出来る。;
function funcA(){}
funcA(funcB); // funcBはcallback、funcA内でxは使える、aにも書ける
function funcB(){} // funcB内でa,xは使える、bにも書ける
}
だからawait毎にぶった切ってcallbackしても、上から順に実行するだけの単純ソースにしかならない。
JavaScriptなら、どっちでもいいや位でしかないんだよ。
C#ではこれができないから、async/awaitが必要だってだけで。

ただ俺もcallbackと言ったがこれは間違いだった。VC++では非同期のcallbackはやってないわ。
ウザイと思ったのは関数ポインタを差し込む時に型チェックがあることだった。
上記の通り、JavaScriptでは関数ポインタでさえあれば引数の型と個数は関係なく呼んでくるので、
関数ポインタを差し込む時にいちいち考える必要がないんだよ。
そして機能追加は追加パスだけの変更で済む。
C++の型チェックだと変更がソース全体に及ぶしこれを断れない。
引数の型とか個数を間違えた場合、普通は根本的に動かないなら、テストでは当てさえすれば検出出来る。
そんな簡単なエラーチェックの為にコンパイルを通すだけの為にいちいち型を合わせたり、
変更がソース全体に波及するのが危険でウザイって事。
2017/08/30(水) 23:04:03.99ID:F1WQhw000
> コールバックの処理が適切なことはテストとかで保証するとか考えると
どのみちテストはやらんと駄目でしょ。と言うか、逆に、
「コールバックの処理が適切なことは『型検査』で保証する」ってのは無理でしょ。
Haskellのキチガイ共はそういう思想らしいが。

「型安全」ってのはバグの一つの形「インタフェース(接続部)の間違い」を検出するだけであって、
処理の中身が間違っている場合は全く検出出来ない。つまりテストは省略出来ない。
それで「型安全」にするために払うコストと、それによって受ける恩恵を考えた場合、
俺にとっては「無いよりマシ」程度で、「投げ捨ててまで」って程の価値はないね。
とはいえtypoを検出する機能だけは欲しいんだが、逆に言えばそれだけで十分だ。

>>160
多分、constで最適化ガーってのはやっぱり無いんだよ。
想定されるケースはそちらの挙げたとおりで、
void someFunc(){
// (A)
hoge(&a, &b); // (B)
// (C)
}
で、(B)で変更されないことを保証されれば、
(A)時点の&a, &bのキャッシュ(というかローカル変数に取ったもの)が
(C)でも有効です、ってだけだが、そもそもこのケースがないだろ。

自関数内で変更してるかどうかはコンパイラには明確に分かるんだから、
考えられるのはこのように他関数をまたいだケースなんだけど、
それなら最初から(A)(C)(B)の順に処理しろ、でしかないし。
((B)で変更されるから(C)は(B)の後ろなのであって)
2017/08/30(水) 23:14:59.21ID:58Rp2mqQ0
ただmsvcrtを使うということはvcがサポートするC規格に引きずられるのを留意しておくこと
最新のmsvcrtでもたしかC99止まりでinttypes.hをインクルードしてもPRId64とか使えない
C11の機能が欲しければ素直にlinux+gcc|clangの環境をオススメする
2017/08/30(水) 23:55:33.72ID:FdjUx67gd
最適化かけないと通るけど、最適化かけるとセグフォ
プリントデバッグしたらプリント文置いたり減らしたりするだけで最後に表示されるものが変わる
なんだこれ
2017/08/31(木) 00:01:55.43ID:B2+zi4Baa
最後に¥0を付けてないとか
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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