- 1 名前:デフォルトの名無しさん(ワッチョイ dfcf-HvS5) mailto:sage [2017/01/09(月) 14:49:27.56 ID:p96WJVyd0.net]
- 次スレを立てる時は本文の1行目に以下を追加して下さい
!extend:on:vvvvv:1000:512 C++に関する質問やら話題やらはこちらへどうぞ。 ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。 前スレ C++相談室 part128 echo.2ch.net/test/read.cgi/tech/1480172629/ このスレもよろしくね。 【初心者歓迎】C/C++室 Ver.100【環境依存OK】 echo.2ch.net/test/read.cgi/tech/1478440682/ ■長いソースを貼るときはここへ。■ codepad.org/ https://ideone.com/ [C++ FAQ] https://isocpp.org/wiki/faq/ www.bohyoh.com/CandCPP/FAQ/ (日本語) VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
- 1012 名前:デフォルトの名無しさん (ワッチョイ f359-HQfx) mailto:sage [2017/03/30(木) 21:39:33.97 ID:8zS706yR0.net]
- 次のコードで実験でくる。今日実験したら答えはcall_foo_a()もcall_foo_b()も30やったわ;
■ "a.cpp" static foo { int func(int x, int y) { return x + y; } }; void call_foo_a() { foo x; printf("%s: func(10, 20)=%d\n", __FUNCTION__, x.func(10, 20)); } ■ "b.cpp" (a.cppと同じだが、foo::func()の中身を return x - y;に変えたやつ) ■ "main.cpp" extern void call_foo_a(); extern void call_foo_b(); int main() { call_foo_a(); call_foo_b(); }
- 1013 名前:デフォルトの名無しさん (ワッチョイ f359-HQfx) mailto:sage [2017/03/30(木) 21:43:20.63 ID:8zS706yR0.net]
- >>987
それはそうかもしれないが、無名namespaceのマングリング規則がトリッキーなのを >>987は知らないんじゃないの; いや詳しくは漏れも知らんが、 実際>>988のコードは"a.cpp"と"b.cpp"のfooをどっちも無名namespaceで囲えば正しく動く、 (call_foo_a()は30、call_foo_b()は-10となる、
- 1014 名前:デフォルトの名無しさん (オッペケ Sr17-bOuD) mailto:sage [2017/03/30(木) 21:45:46.29 ID:dELrX4bqr.net]
- >>983
>しかし関数の中身が違うケースを考えると良い なるほど それはクラスの定義自体が漏れていることが問題なのだが なぜかメンバ関数の問題と勘違いしてしまったのだな
- 1015 名前:デフォルトの名無しさん (ワッチョイ f359-HQfx) mailto:sage [2017/03/30(木) 21:49:03.80 ID:8zS706yR0.net]
- >>990
何言ってるのかわからんが推測でレスするが、 メンバ関数を含まないクラスや構造体はリンクが必要なシンボルを生成しないから 同名のブツが複数の翻訳単位にあっても全く問題は無い(よってC言語はstaticだけで逝けた つまりメンバ関数がこの話の本質だとわかっていない>>990のレスは大概だ、
- 1016 名前:デフォルトの名無しさん (オッペケ Sr17-bOuD) mailto:sage [2017/03/30(木) 22:05:28.61 ID:dELrX4bqr.net]
- >全く問題は無い
なるほど ODR違反の未定義動作が問題無いと考えてしまうようでは致し方ない。 ちなみにC++にはテンプレートというものが有って 重複定義された型をパラメーターに持つテンプレートのインスタンスが問題を起こすと言うことには気づかなかったらしい
- 1017 名前:デフォルトの名無しさん (ワッチョイ f359-HQfx) mailto:sage [2017/03/30(木) 22:15:12.42 ID:8zS706yR0.net]
- >>992
ていうか話は逆で、>>988のようなケースがあるからODR制約という概念が生まれ、 無名namespaceは>>988のようなケースにおける解決策 (異なるマングリング名で異なる定義を識別するのだからODR制約には抵触しなくなる ソースは脳内 >重複定義された型をパラメーターに持つテンプレートのインスタンスが問題を起こすと言うことには気づかなかったらしい そりゃーODR制約違反のソースだとそうなるが、 無名namespaceで修正した>>988のfooでは起き得ない話、
- 1018 名前:デフォルトの名無しさん (オッペケ Sr17-bOuD) mailto:sage [2017/03/30(木) 22:24:43.35 ID:dELrX4bqr.net]
- >無名namespaceで修正した>>988のfooでは起き得ない話、
うーむ、二つ前の本人のレスは 無名namespaceで修正してなくても関数が無ければ全く問題ない だったと思うのだが、もう忘れたのだろうか
- 1019 名前:デフォルトの名無しさん (ワッチョイ f359-HQfx) mailto:sage [2017/03/30(木) 22:47:57.29 ID:8zS706yR0.net]
- おk
無名namespaceで修正して「いない」>>998はODR違反だった気がするので 今謹んで訂正した、
- 1020 名前:デフォルトの名無しさん (ワッチョイ d372-8ugA) mailto:sage [2017/03/30(木) 23:55:20.49 ID:Plkrcx8f0.net]
- >>976
テンプレート関数だからでした。 想定されてたコンパイラのテンプレートの解釈がinclusion-modelってやつで、そのためでした。 ありがとうございました。
- 1021 名前:デフォルトの名無しさん (ワッチョイ efc8-CrJt) mailto:sage [2017/03/31(金) 01:06:57.90 ID:ryHYQIXS0.net]
- こういう糞議論してる間にほかの言語で着々とプロダクトが作られていくわけである。
- 1022 名前:デフォルトの名無しさん (ワッチョイ f37a-QmV0) mailto:sage [2017/03/31(金) 01:09:12.34 ID:UkLjKqcm0.net]
- 記述の自由度が高いせいで全貌を知る者がほとんど居ない
- 1023 名前:デフォルトの名無しさん (ワッチョイ cf36-FVbu) mailto:sage [2017/03/31(金) 01:14:14.24 ID:RI1LGJ050.net]
- いや利用者の多いまともなプロダクトはc++で記述されているのが多いだろ。
LL言語のVMとかブラウザとかもそうだし
- 1024 名前:デフォルトの名無しさん (ワッチョイ cf92-KV4R) [2017/03/31(金) 01:44:24.21 ID:zbf3isLY0.net]
- パフォーマンスが重要な製品作る必要あるなら現状C++しか選択肢ないからね
- 1025 名前:過去ログ ★ [[過去ログ]]
- ■ このスレッドは過去ログ倉庫に格納されています
|

|