[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2ch.scのread.cgiへ]
Update time : 10/30 03:13 / Filesize : 322 KB / Number-of Response : 1026
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C++相談室 part129



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 名前:過去ログ ★ [[過去ログ]]
■ このスレッドは過去ログ倉庫に格納されています






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧](;´∀`)<322KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef