エスケープシーケンスやWin32APIなどの環境依存なものもOK
そのような質問は必ず環境を書きましょう
半角空白やタブでのインデントはスレに貼ると無くなります
コードを貼れる所
http://codepad.org/
https://ideone.com/
前スレ
【初心者歓迎】C/C++室 Ver.103【環境依存OK】
https://mevius.5ch.net/test/read.cgi/tech/1530384293/
探検
【初心者歓迎】C/C++室 Ver.104【環境依存OK】
■ このスレッドは過去ログ倉庫に格納されています
2018/12/28(金) 06:04:52.38ID:ufThBpcD
445デフォルトの名無しさん
2019/02/11(月) 14:56:36.09ID:0TxoCFW6 >>441
正しくは、次のようにアクセス制御のための「public :」を書かないといけない。
class CMyClass {
protected :
BYTE *m_pBuf; // 高速化のため、自動的には初期化はされないのでコンストラクタで初期化する。
public :
CMyClass() { // コンストラクタ
m_pBuf = NULL; // メモリをまだ未割り当てであることをマークするためにこうしておく
}
~CMyClass() { // デストラクタ
if ( m_pBuf != NULL ) {
delete [] m_pBuf; // メモリの解放
}
}
}
なお、必要に応じて、コンストラクタの中で、m_pBuf = new BYTE [xxx]; のように書いても良い。
それと、BYTE は、「オブジェクト」ではないので、あなたの書いているような場合には、
BYTE *m_pBuf の部分を CSomeObject m_pObj; のように変えて、m_pObj = new CSomeObject;
のようにする。
正しくは、次のようにアクセス制御のための「public :」を書かないといけない。
class CMyClass {
protected :
BYTE *m_pBuf; // 高速化のため、自動的には初期化はされないのでコンストラクタで初期化する。
public :
CMyClass() { // コンストラクタ
m_pBuf = NULL; // メモリをまだ未割り当てであることをマークするためにこうしておく
}
~CMyClass() { // デストラクタ
if ( m_pBuf != NULL ) {
delete [] m_pBuf; // メモリの解放
}
}
}
なお、必要に応じて、コンストラクタの中で、m_pBuf = new BYTE [xxx]; のように書いても良い。
それと、BYTE は、「オブジェクト」ではないので、あなたの書いているような場合には、
BYTE *m_pBuf の部分を CSomeObject m_pObj; のように変えて、m_pObj = new CSomeObject;
のようにする。
447デフォルトの名無しさん
2019/02/11(月) 15:03:05.98ID:MkFOBvt9 良い子のみんなは>>441の危険性が理解できるまではスマートポインタを使ってね
おじさんとのお約束だよ
おじさんとのお約束だよ
448デフォルトの名無しさん
2019/02/11(月) 15:11:57.93ID:Qk3j4qw0449さまよえる蟻人間 ◆T6xkBnTXz7B0
2019/02/11(月) 15:18:49.80ID:BEdrdhIs450はちみつ餃子 ◆8X2XSCHEME
2019/02/11(月) 15:19:34.89ID:eS7AzULV451デフォルトの名無しさん
2019/02/11(月) 15:19:51.73ID:3tLemvMU 初心者なので確認
コンストラクタの中に飛び込む前のメンバの初期化で例外発生したら m_pBuf は中途半端になるから
コンストラクタの中で代入するんじゃなく、メンバ初期化子で初期化しろ
という認識でいいのかしら
コンストラクタの中に飛び込む前のメンバの初期化で例外発生したら m_pBuf は中途半端になるから
コンストラクタの中で代入するんじゃなく、メンバ初期化子で初期化しろ
という認識でいいのかしら
452さまよえる蟻人間 ◆T6xkBnTXz7B0
2019/02/11(月) 15:29:14.84ID:BEdrdhIs >>451
「C++ 例外安全」でググれ。ナマポを使わずに、素直に生配列、コンテナ、スマポのどれかを使えば済むこと。マネージされてないナマポは村八分にしろ。
「C++ 例外安全」でググれ。ナマポを使わずに、素直に生配列、コンテナ、スマポのどれかを使えば済むこと。マネージされてないナマポは村八分にしろ。
453デフォルトの名無しさん
2019/02/11(月) 15:39:02.97ID:3tLemvMU なんとなくわかった ような気がする
生ポそのものはコンストラクタもデストラクタに何ら操作しないから宙ぶらりんこになるのか
生ポそのものはコンストラクタもデストラクタに何ら操作しないから宙ぶらりんこになるのか
454デフォルトの名無しさん
2019/02/11(月) 15:41:57.41ID:dGdUrFsa ちょっち理解は大変だけど生ポはスマポにドンドン置き換えたい
455さまよえる蟻人間 ◆T6xkBnTXz7B0
2019/02/11(月) 15:43:11.94ID:BEdrdhIs スマポならコピーコンストラクター・代入のややこしさからも解放される。
456はちみつ餃子 ◆8X2XSCHEME
2019/02/11(月) 15:52:25.23ID:eS7AzULV まあまあ。
スマートポインタを活用しろというのはその通りだが、
ポインタ (や例外機構) を理解せずに
思考停止してスマートポインタを使うのはあかんやろ。
ここの元質問者はまだそこを理解しようとしている
ところなんだから、スマートポインタを使わなかった場合にどう書けば良いのか、
きちんと書くと面倒くさすぎるという体験も必要だろ。
スマートポインタを活用しろというのはその通りだが、
ポインタ (や例外機構) を理解せずに
思考停止してスマートポインタを使うのはあかんやろ。
ここの元質問者はまだそこを理解しようとしている
ところなんだから、スマートポインタを使わなかった場合にどう書けば良いのか、
きちんと書くと面倒くさすぎるという体験も必要だろ。
457さまよえる蟻人間 ◆T6xkBnTXz7B0
2019/02/11(月) 16:16:38.24ID:fD0IDjkv 所有権の管理は人類には早すぎる。
所有権が変動するときは、スマポでOK.
所有権が変動するときは、スマポでOK.
458さまよえる蟻人間 ◆T6xkBnTXz7B0
2019/02/11(月) 16:28:46.52ID:fD0IDjkv こんなときはナマポを使ってもよい:
処理の中で所有権が移動・消滅しない場合。
バイナリーデータやPODを生で扱う場合。
処理系がナマポやトークンやハンドルの入力を要求する場合。
処理の中で所有権が移動・消滅しない場合。
バイナリーデータやPODを生で扱う場合。
処理系がナマポやトークンやハンドルの入力を要求する場合。
459デフォルトの名無しさん
2019/02/11(月) 16:36:19.07ID:QKPibkAC 生ポはスマポのオーバーヘッドすら許容できないときに使うものです
だから初心者は無理して生ポを使わなくていいです
だから初心者は無理して生ポを使わなくていいです
460デフォルトの名無しさん
2019/02/11(月) 16:59:08.84ID:V2lM2C5l >>434
スマポは後になって導入されたもので人気がない、なんて意見は一般的ではないので無視して良い
スマポは後になって導入されたもので人気がない、なんて意見は一般的ではないので無視して良い
461デフォルトの名無しさん
2019/02/11(月) 18:19:37.85ID:j549IniP スマポをC#のusing感覚で使ってる
462デフォルトの名無しさん
2019/02/12(火) 13:19:56.52ID:VqanzRzk エアプwwwwwwwww今は参照カウントじゃねーよw残念だったなクソ蟻wwww
463デフォルトの名無しさん
2019/02/12(火) 13:20:43.00ID:VqanzRzk それで、Cの生ポってC/C++以外で表現するなら何なんだ?
464デフォルトの名無しさん
2019/02/12(火) 16:02:24.32ID:VerJGrBE >>463
native int
native int
465デフォルトの名無しさん
2019/02/12(火) 17:27:09.82ID:VqanzRzk >>464
仮装アドレス的な意味で来るとは思ってなかったwでも本質はそうだよなあ
仮装アドレス的な意味で来るとは思ってなかったwでも本質はそうだよなあ
466デフォルトの名無しさん
2019/02/12(火) 17:29:23.18ID:t+DTqVP+ CALL -151
467デフォルトの名無しさん
2019/02/13(水) 06:16:37.08ID:2WlGbphz >>463 今の言語は極力「生のポインタ」が見えないようにしてるからなぁ。
オレの乏しい知識で無理矢理ヒネリ出すなら、
「古いBASICの peek, poke のアドレス指定に変数を使った場合」かのう。
型のない単なるアドレスって言うか数値だけど。
オレの乏しい知識で無理矢理ヒネリ出すなら、
「古いBASICの peek, poke のアドレス指定に変数を使った場合」かのう。
型のない単なるアドレスって言うか数値だけど。
468デフォルトの名無しさん
2019/02/13(水) 15:13:52.62ID:Yg4iFXpY upvar
469デフォルトの名無しさん
2019/02/13(水) 15:46:18.41ID:SgfrIpbp >>463
BYTE ptr = アドレス値;
BYTE MEM[4096 * 1024]; // 4GB のメモリ配列
*ptr ---> MEM[ptr] // ptr は MEM[] 配列の添え字
BYTE ptr = アドレス値;
BYTE MEM[4096 * 1024]; // 4GB のメモリ配列
*ptr ---> MEM[ptr] // ptr は MEM[] 配列の添え字
470デフォルトの名無しさん
2019/02/13(水) 15:46:56.07ID:GHq8zte2 訂正:
BYTE MEM[4096 * 1024 * 1024]; // 4GB のメモリ配列
BYTE MEM[4096 * 1024 * 1024]; // 4GB のメモリ配列
471デフォルトの名無しさん
2019/02/13(水) 15:48:00.46ID:GHq8zte2 訂正:
Uint32 ptr = アドレス値;
Uint32 ptr = アドレス値;
472デフォルトの名無しさん
2019/02/13(水) 18:19:07.37ID:QnNf1eu6 恥の上塗り
473デフォルトの名無しさん
2019/02/13(水) 19:18:53.91ID:BFnAt9lr intptr_t とか、INTPTRとか。
474デフォルトの名無しさん
2019/02/13(水) 19:41:39.99ID:D91GFqhb eax
475デフォルトの名無しさん
2019/02/13(水) 22:43:21.58ID:8CyDgeqf 行儀よく バッファなんて 守れやしなかった
夜のサーバ オーバフロー起こしてまわった
*印見て アナルといわれた 早く添え字になりたかった
信じられぬ カーニハンとの 争いの中で
許しあい いったい何 解りあえただろう
うんざりしながら それでも過ごした ひとつだけ解ってたこと
このポインタからの 卒業
夜のサーバ オーバフロー起こしてまわった
*印見て アナルといわれた 早く添え字になりたかった
信じられぬ カーニハンとの 争いの中で
許しあい いったい何 解りあえただろう
うんざりしながら それでも過ごした ひとつだけ解ってたこと
このポインタからの 卒業
476デフォルトの名無しさん
2019/02/14(木) 07:38:16.87ID:fSoz/vTj まあstatic変数やglobal変数使ってリークしてないとか言い張るバカよりかは
ナマポ使えやとは思う。
それならまだコード修正効くからな。
初心者にスマポ使わせればリークしないコード書かせることができるって考えははっきりいって幻想だわ。
ナマポ使えやとは思う。
それならまだコード修正効くからな。
初心者にスマポ使わせればリークしないコード書かせることができるって考えははっきりいって幻想だわ。
477デフォルトの名無しさん
2019/02/14(木) 22:35:36.88ID:vW9ukCJU 昔研究室の後輩でポインタがわからないから全部グローバル変数でプログラム作ってるって奴がいて、
それはそれである意味すごいなって思ったわ。
マルチメディア系ライブラリを触る必要がある研究室なのだが。
元々組込系が得意な奴だったってのもあると思うけど。
それはそれである意味すごいなって思ったわ。
マルチメディア系ライブラリを触る必要がある研究室なのだが。
元々組込系が得意な奴だったってのもあると思うけど。
478デフォルトの名無しさん
2019/02/14(木) 22:50:47.58ID:tlcLfILV COBOLERだったんじゃね
479デフォルトの名無しさん
2019/02/15(金) 00:04:29.72ID:tnuHGyjk 一度切りの使い捨て用途とかなら全然よくね
480デフォルトの名無しさん
2019/02/15(金) 00:36:18.42ID:kpfA4lgp >>476
スマートポインタを使うとコード修正効かなくなるの?どういうこと?
スマートポインタを使うとコード修正効かなくなるの?どういうこと?
481デフォルトの名無しさん
2019/02/15(金) 00:46:46.72ID:TR5VS7Vw mp4boxをちょこっといじったのを作ろうとしたんだけど、
signed int32の計算で -2112000 / 48000 の結果が 89434 になるんですが。
VS2015のx64です。
signed int32の計算で -2112000 / 48000 の結果が 89434 になるんですが。
VS2015のx64です。
482デフォルトの名無しさん
2019/02/15(金) 06:57:51.95ID:OZ8Dcboc >>481 「-2112000 / 48000 の結果が 89434」
その環境を持ってないんで分からないけど、
-2112000 の32bit16進数表現が 0xffdfc600
89434 * 48000 == 4292832000.000 == 0xffdf6b00
両者のビットパターンが一致することと関係ありそうね。
被除数の -2112000 を64bitで表現する際に
符号拡張 0x_ffff_ffff_ffdf_c600 とすべきなのに
ゼロ拡張 0x_0000_0000_ffdf_c600 にしちゃって、
その後の計算は64bit正数でやってる感じかな。
その環境を持ってないんで分からないけど、
-2112000 の32bit16進数表現が 0xffdfc600
89434 * 48000 == 4292832000.000 == 0xffdf6b00
両者のビットパターンが一致することと関係ありそうね。
被除数の -2112000 を64bitで表現する際に
符号拡張 0x_ffff_ffff_ffdf_c600 とすべきなのに
ゼロ拡張 0x_0000_0000_ffdf_c600 にしちゃって、
その後の計算は64bit正数でやってる感じかな。
483デフォルトの名無しさん
2019/02/15(金) 07:20:58.81ID:1DfV94Wg >>480
本人がスマポ理解できてないってオチだろ
本人がスマポ理解できてないってオチだろ
484デフォルトの名無しさん
2019/02/15(金) 07:22:53.73ID:1DfV94Wg485482
2019/02/15(金) 07:53:28.61ID:OZ8Dcboc 再び >>481 「-2112000 / 48000 の結果が 89434」 (間違いを訂正)
-2112000 の32bit16進数表現が 0xffdfc600
89434 * 48000 == 4292832000.000 == 0xffdf6b00
ビットパターン一致してないね。桁数多くて見間違えちゃった(テヘペロ)。
-2112000 を32bitで表現すると 0xffdfc600 であり、
これをゼロ拡張した 0x_0000_0000_ffdf_fc600 == 4292855330 を
48000 で割り算して小数部を捨てれば 89434 という答えが出る。
ということなら合ってるかな。
-2112000 の32bit16進数表現が 0xffdfc600
89434 * 48000 == 4292832000.000 == 0xffdf6b00
ビットパターン一致してないね。桁数多くて見間違えちゃった(テヘペロ)。
-2112000 を32bitで表現すると 0xffdfc600 であり、
これをゼロ拡張した 0x_0000_0000_ffdf_fc600 == 4292855330 を
48000 で割り算して小数部を捨てれば 89434 という答えが出る。
ということなら合ってるかな。
487デフォルトの名無しさん
2019/02/15(金) 09:49:31.73ID:tuwIijw4488デフォルトの名無しさん
2019/02/15(金) 13:45:38.25ID:TNDmXWGM489デフォルトの名無しさん
2019/02/15(金) 21:13:40.77ID:kkRd+/gL490デフォルトの名無しさん
2019/02/17(日) 07:14:37.91ID:KxX3tJEE 超初歩的な質問になるのですが
scanf関数を使って20個未満の任意の数だけ、数値を配列変数で受け取りたいです
たとえば「2 4 8 9」と入力し、Enterが押されたらそれで確定
num[0]=2
num[1]=4
num[2]=8
num[3]=9
としたいわけです。
どうしたらよいでしょうか?
一応自分で考えたコード(期待通りの動きをしません)を掲載します
for(i=0;i<20;i++){
scanf("%d",&num[i]);
if(num[i]==‘¥n’){
break;
}
}
scanf関数を使って20個未満の任意の数だけ、数値を配列変数で受け取りたいです
たとえば「2 4 8 9」と入力し、Enterが押されたらそれで確定
num[0]=2
num[1]=4
num[2]=8
num[3]=9
としたいわけです。
どうしたらよいでしょうか?
一応自分で考えたコード(期待通りの動きをしません)を掲載します
for(i=0;i<20;i++){
scanf("%d",&num[i]);
if(num[i]==‘¥n’){
break;
}
}
491デフォルトの名無しさん
2019/02/17(日) 07:30:35.53ID:a45/WyPQ for(i=0;i<20;i++) if (scanf("%d",&num[i]) != 1) break;
492デフォルトの名無しさん
2019/02/17(日) 09:09:16.12ID:uZDoAvc4 >>490
scanfや標準ライブラリの関数など、参考書とかで普通の使い方はわかると思うけど、細かい仕様をmsdnやmanコマンドで調べるようにするとかなり理解が広がると思うよ。
scanfや標準ライブラリの関数など、参考書とかで普通の使い方はわかると思うけど、細かい仕様をmsdnやmanコマンドで調べるようにするとかなり理解が広がると思うよ。
493デフォルトの名無しさん
2019/02/17(日) 22:37:58.74ID:O/E0SKNM 中途半端なUI使うよりもcsvパーサーを作るかどっかからとってくるかすれば?
494デフォルトの名無しさん
2019/02/18(月) 00:02:29.61ID:yZfkTbdS autoってコンパイル遅くなりますか?
>>494
むしろ遅くなる方に振れるでしょうけれど、そんなのどうでもいいのでは?
むしろ遅くなる方に振れるでしょうけれど、そんなのどうでもいいのでは?
496デフォルトの名無しさん
2019/02/18(月) 01:22:44.39ID:c9cLPpQ7 autoって変数の型宣言の話だよね?
コンパイルは遅くなるのか
速くしたい時はどうすりゃ良いの?
コンパイルは遅くなるのか
速くしたい時はどうすりゃ良いの?
497はちみつ餃子 ◆8X2XSCHEME
2019/02/18(月) 01:27:51.06ID:ViRlfcsh C++ の auto は右辺と一致させるように推論するだけの単純機構で、
ややこしい演算で推論するわけではないので、
コンパイル速度ではほとんど差はないと思うよ。
ややこしい演算で推論するわけではないので、
コンパイル速度ではほとんど差はないと思うよ。
498デフォルトの名無しさん
2019/02/18(月) 01:30:04.86ID:tKsXQ0K5 autoはむしろコンパイル速くなるんじゃない?
いちいち型を解決せずとも、既に解決済みの型を右から左へコピーするだけでいいんだから
C++でコンパイルを速くするのは簡単で、単純にソースファイル数とインクルードするヘッダを減らせばいい
C++のコンパイルが遅いのは主にコンパイル単位という時代遅れで極めて非効率なコンパイル戦略に起因しており、実はコードの複雑さ自体はわりとどうでもいい
いちいち型を解決せずとも、既に解決済みの型を右から左へコピーするだけでいいんだから
C++でコンパイルを速くするのは簡単で、単純にソースファイル数とインクルードするヘッダを減らせばいい
C++のコンパイルが遅いのは主にコンパイル単位という時代遅れで極めて非効率なコンパイル戦略に起因しており、実はコードの複雑さ自体はわりとどうでもいい
>>496
C++を言語として選択した時点で「記述の時間やコンパイル時間を投資して実行時間を稼ぐ」という思想なのでは?コンパイル時間を短くする努力はする気がないと思います
C++を言語として選択した時点で「記述の時間やコンパイル時間を投資して実行時間を稼ぐ」という思想なのでは?コンパイル時間を短くする努力はする気がないと思います
501デフォルトの名無しさん
2019/02/18(月) 05:41:12.34ID:KTgkm+s5 >>490 サーバーの 503 エラーに引っかかって昨日のうちに書けなかったんだが…。
>>491 の方法だと Enter が単純に読み捨てられて scanf() が終了せず
まだ入力をよこせと言ってくるからダメみたいね。
11 22 33 (Enter) だと読み込みが継続、期待通りに動作しない
11 22 33 x (Enter) なら x を解釈する時点で scanf() が 0 を返してループ脱出
先に文字列として1行読み込んで sscanf() と思ったけど…
ndat = sscanf(s, "%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d",
&num[0], &num[1], &num[2], &num[3], &num[4], &num[5], &num[6], &num[7], &num[8], &num[9],
&num[10], &num[11], &num[12], &num[13], &num[14], &num[15], &num[16], &num[17], &num[18], &num[19]);
実際に読めた値の個数は ndat に入る。
これは書くのもメンテナンスするのも嫌だなぁ。
strtol() で1個ずつ数値を拾いつつ、地道にポインタ進める方が良いかも。
>>491 の方法だと Enter が単純に読み捨てられて scanf() が終了せず
まだ入力をよこせと言ってくるからダメみたいね。
11 22 33 (Enter) だと読み込みが継続、期待通りに動作しない
11 22 33 x (Enter) なら x を解釈する時点で scanf() が 0 を返してループ脱出
先に文字列として1行読み込んで sscanf() と思ったけど…
ndat = sscanf(s, "%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d",
&num[0], &num[1], &num[2], &num[3], &num[4], &num[5], &num[6], &num[7], &num[8], &num[9],
&num[10], &num[11], &num[12], &num[13], &num[14], &num[15], &num[16], &num[17], &num[18], &num[19]);
実際に読めた値の個数は ndat に入る。
これは書くのもメンテナンスするのも嫌だなぁ。
strtol() で1個ずつ数値を拾いつつ、地道にポインタ進める方が良いかも。
502デフォルトの名無しさん
2019/02/18(月) 05:53:27.02ID:KTgkm+s5503デフォルトの名無しさん
2019/02/18(月) 08:39:38.41ID:KTgkm+s5 瑣末なことだけど val_a, val_b って変数名は良くなかったね。
変数 variable の例なんだから var_a, var_b だわな。
というか、この場合は a, b で十分だ。
変数 variable の例なんだから var_a, var_b だわな。
というか、この場合は a, b で十分だ。
504デフォルトの名無しさん
2019/02/18(月) 10:06:03.91ID:PGieQvh3 まず計測しろよ
505491
2019/02/18(月) 13:24:52.92ID:fHtoi1qq506デフォルトの名無しさん
2019/02/18(月) 13:29:17.97ID:fHtoi1qq 505の後半は無しで
1文字ずつ切り出して解析してったほうがよさそうね
1文字ずつ切り出して解析してったほうがよさそうね
507デフォルトの名無しさん
2019/02/18(月) 15:27:41.58ID:bbNHvPxv コンパイル時間にリンク時間は含まれますか?
509デフォルトの名無しさん
2019/02/18(月) 15:34:26.17ID:c9cLPpQ7 人間の様な邪悪なものからの入力でscanfは使うなと、ばっちゃは言ってた
>>502
>func() の返す型そのまんまで val_b を作ればいい
この発想は実行時なのでは?
>てな具合に考えると auto で定義した方がコンパイル時の手間が少ない、
実行時の発想をコンパイル時に適用していいのでしょうか?
>func() の返す型そのまんまで val_b を作ればいい
この発想は実行時なのでは?
>てな具合に考えると auto で定義した方がコンパイル時の手間が少ない、
実行時の発想をコンパイル時に適用していいのでしょうか?
>>504
コンパイル時間を計測するのですか?…
コンパイル時間を計測するのですか?…
>>509
賛成です、そういうのは1ラインを秘術を尽くして何とか読み込み、後で sscanf() とかを使うべき
賛成です、そういうのは1ラインを秘術を尽くして何とか読み込み、後で sscanf() とかを使うべき
513デフォルトの名無しさん
2019/02/18(月) 21:15:24.03ID:JRPNr6+t514デフォルトの名無しさん
2019/02/18(月) 21:20:31.62ID:etvvcICH516デフォルトの名無しさん
2019/02/18(月) 23:37:20.44ID:Q29xkQ9H >>515
初めからずっとコンパイル時間の話をしている。お前さんだけ噛み合ってないから、もう黙っててくれ。
初めからずっとコンパイル時間の話をしている。お前さんだけ噛み合ってないから、もう黙っててくれ。
517デフォルトの名無しさん
2019/02/19(火) 15:32:09.41ID:Hz70ZqtS C++です
インクルードガードがあっても関数の定義がヘッダに書かれていればヘッダが複数回読み込まれていた場合リンク時に多重インクルードでエラーが出る
ここまではわかるのですが、同じことをクラス関数で実験した結果エラーになりませんでした
具体的にはヘッダのクラス内に関数定義を書いて複数のファイルからインクルードしました
これはどういうことなのでしょうか?
インクルードガードがあっても関数の定義がヘッダに書かれていればヘッダが複数回読み込まれていた場合リンク時に多重インクルードでエラーが出る
ここまではわかるのですが、同じことをクラス関数で実験した結果エラーになりませんでした
具体的にはヘッダのクラス内に関数定義を書いて複数のファイルからインクルードしました
これはどういうことなのでしょうか?
518デフォルトの名無しさん
2019/02/19(火) 16:00:36.20ID:uP1odnYQ >>517
クラス定義の中に書かれたメンバ関数の定義は
自動的にインライン関数になる(関数の実体の定義ではない)
この場合は、複数の場所にメンバ関数の実体が作られるわけじゃない、
という説明でどうかな。
クラス定義の中に書かれたメンバ関数の定義は
自動的にインライン関数になる(関数の実体の定義ではない)
この場合は、複数の場所にメンバ関数の実体が作られるわけじゃない、
という説明でどうかな。
520デフォルトの名無しさん
2019/02/19(火) 17:23:21.85ID:Hz70ZqtS >>518
なるほど
クラス内に定義を書くとインライン関数になって普通の関数としては扱われないんですね
もう少し理解するために調べたのですが、インライン関数は内部リンケージのみを持つものとしてコンパイラに解釈されるらしいですね
だからコンパイラはファイル間での関数の重複を調べようとしない
そしてインクルードによって複数のファイルで同じものを読み込んだとしてもエラーにはならないと・・・
理解です
勉強になりました
ありがとうございました
なるほど
クラス内に定義を書くとインライン関数になって普通の関数としては扱われないんですね
もう少し理解するために調べたのですが、インライン関数は内部リンケージのみを持つものとしてコンパイラに解釈されるらしいですね
だからコンパイラはファイル間での関数の重複を調べようとしない
そしてインクルードによって複数のファイルで同じものを読み込んだとしてもエラーにはならないと・・・
理解です
勉強になりました
ありがとうございました
521502
2019/02/19(火) 17:39:36.16ID:uP1odnYQ 失礼、なぜか >>510 を見逃してて(黙殺するような意図はまったくなかった)。
C++ は関数を宣言・定義するときに返り値型を書くから
auto で受けてもコンパイル時に曖昧さは生じないと考えたんだけど。
実行時まで返り値の型が決まらない関数って作れるんだっけ?
これは純粋に質問、教えを乞いたい。
あんまり高度な話だと振り落とされるかも知れないけど。
C++ は関数を宣言・定義するときに返り値型を書くから
auto で受けてもコンパイル時に曖昧さは生じないと考えたんだけど。
実行時まで返り値の型が決まらない関数って作れるんだっけ?
これは純粋に質問、教えを乞いたい。
あんまり高度な話だと振り落とされるかも知れないけど。
522デフォルトの名無しさん
2019/02/19(火) 17:48:52.81ID:h1wI7nx1 型推論が実行時に行われるとかトンチキこいてるやつが一人騒いでるだけ
523デフォルトの名無しさん
2019/02/19(火) 18:43:18.16ID:+3biNeIC >>521
おそらく君の書いた「func()の返す型〜」をqz某が勝手に勘違いしているだけだからスルーしていいよ。
初心者が必ずしも正確な用語を使わないことくらい想像つくだろうし、文脈からして普通ならそんな勘違いはしないはずなのだが。
おそらく君の書いた「func()の返す型〜」をqz某が勝手に勘違いしているだけだからスルーしていいよ。
初心者が必ずしも正確な用語を使わないことくらい想像つくだろうし、文脈からして普通ならそんな勘違いはしないはずなのだが。
524はちみつ餃子 ◆8X2XSCHEME
2019/02/20(水) 00:20:40.27ID:C98K3aY7525デフォルトの名無しさん
2019/02/20(水) 00:28:15.76ID:qDW9CRq2 >>520
> もう少し理解するために調べたのですが、インライン関数は内部リンケージのみを持つものとしてコンパイラに解釈されるらしいですね
どこにそんな嘘書いてあった?
https://timsong-cpp.github.io/cppwp/n4659/dcl.inline#footnote-94
> The inline keyword has no effect on the linkage of a function.
> もう少し理解するために調べたのですが、インライン関数は内部リンケージのみを持つものとしてコンパイラに解釈されるらしいですね
どこにそんな嘘書いてあった?
https://timsong-cpp.github.io/cppwp/n4659/dcl.inline#footnote-94
> The inline keyword has no effect on the linkage of a function.
526デフォルトの名無しさん
2019/02/20(水) 00:47:02.04ID:rsRaa5eC >>525
IBMのサイトに書いてありました・・・
と思って今見返したらこれはIBMの統合開発環境のページなのでその開発環境の仕様かもしれないですね
失礼しました
https://www.ibm.com/support/knowledgecenter/ja/ssw_ibm_i_72/rzarg/inline_linkage.htm
>インライン関数は内部リンケージを持っているものとして処理されるので
IBMのサイトに書いてありました・・・
と思って今見返したらこれはIBMの統合開発環境のページなのでその開発環境の仕様かもしれないですね
失礼しました
https://www.ibm.com/support/knowledgecenter/ja/ssw_ibm_i_72/rzarg/inline_linkage.htm
>インライン関数は内部リンケージを持っているものとして処理されるので
527デフォルトの名無しさん
2019/02/20(水) 09:09:52.38ID:qDW9CRq2 >>526
「C のみの始まり」〜「C のみの終わり」で囲まれているとおり、それはCの仕様だね。
「C のみの始まり」〜「C のみの終わり」で囲まれているとおり、それはCの仕様だね。
>>525
それは inline キーワードで束縛された関数は、inline 展開される多数の実体と、外部リンケージによって外部からコールできるものとで別の実体をコンパイラは作成する、ってことですか
まあ inline しまくって無駄にバイナリーを増やすくらいだったら、ついでに1 個の外部リンケージで呼べる実体を追加したって、いろいろな面で大差がない、とはいえますね
それは inline キーワードで束縛された関数は、inline 展開される多数の実体と、外部リンケージによって外部からコールできるものとで別の実体をコンパイラは作成する、ってことですか
まあ inline しまくって無駄にバイナリーを増やすくらいだったら、ついでに1 個の外部リンケージで呼べる実体を追加したって、いろいろな面で大差がない、とはいえますね
529デフォルトの名無しさん
2019/02/21(木) 01:44:35.45ID:HXHB3ZEN >>528
「それ」が何を指して言ってるのかよくわかんないけど、 inline 関数に対して
インライン展開されてない「実体」を生成するのもしないのもコンパイラの自由。
外部リンケージを持つ関数について複数のコンパイル単位でアドレスを取って
==, != で比較した場合には一致させないといけないので、アドレスを取られた場合には
そういうコード生成をするのが一般的だろうとは思う。
「それ」が何を指して言ってるのかよくわかんないけど、 inline 関数に対して
インライン展開されてない「実体」を生成するのもしないのもコンパイラの自由。
外部リンケージを持つ関数について複数のコンパイル単位でアドレスを取って
==, != で比較した場合には一致させないといけないので、アドレスを取られた場合には
そういうコード生成をするのが一般的だろうとは思う。
530デフォルトの名無しさん
2019/02/22(金) 22:57:05.70ID:LZ/mWRas 引数や関数にはconstつけられるところは全部つけるべきですか?
531デフォルトの名無しさん
2019/02/23(土) 00:51:14.65ID:CdF18mGW つけて問題ないならつけるべきだけど、まあ実際は面倒くさくなければという程度…
532デフォルトの名無しさん
2019/02/23(土) 10:37:02.21ID:6erMuDJl533デフォルトの名無しさん
2019/02/23(土) 10:39:40.19ID:Iy1q86mj 今は良いけど、半年後の自分は既に他人だと思わないと
534デフォルトの名無しさん
2019/02/23(土) 11:45:29.73ID:+DV3f+Dk const連鎖まんどくせ
535デフォルトの名無しさん
2019/02/23(土) 12:40:33.73ID:aRr2CtyI 530みたいな質問する奴はそもそもconst気にする前に関数が長すぎたり
参照と実値渡しの違いもわかってないと思われるのでその辺をしっかりやった方が良い。
参照と実値渡しの違いもわかってないと思われるのでその辺をしっかりやった方が良い。
536デフォルトの名無しさん
2019/02/23(土) 17:32:16.44ID:7GKXwuwj 入門書の類が、最初のうちは const なしで説明しておいて、
本の後半でおもむろにポインタの引数に const つけることを
載せてたりするせいかもな。
高度な、マニアックな話題みたいな感じで。
文字列(charへのポインタ)を受け取る関数を紹介したら、
すかさず const char* の説明も合わせてすべきって気がする。
const の一般的な価値が分かれば、メンバ関数での func() const {...} の
ありがた味もすぐ飲み込めて const つけまくり派になるでしょ。
本の後半でおもむろにポインタの引数に const つけることを
載せてたりするせいかもな。
高度な、マニアックな話題みたいな感じで。
文字列(charへのポインタ)を受け取る関数を紹介したら、
すかさず const char* の説明も合わせてすべきって気がする。
const の一般的な価値が分かれば、メンバ関数での func() const {...} の
ありがた味もすぐ飲み込めて const つけまくり派になるでしょ。
537デフォルトの名無しさん
2019/02/23(土) 21:02:55.45ID:kvfLWeS8 戻り値を const char* してても、
char* const してなければさほど意味がない。
char* const してなければさほど意味がない。
538デフォルトの名無しさん
2019/02/23(土) 21:20:57.14ID:JpeZVvP/ それは質問なの初心者君?
539デフォルトの名無しさん
2019/02/23(土) 23:45:27.99ID:Z+wYSHT9 クソミソみたいなjavaのconstと違ってC++のconstは
コードの安全性を高めるのに必須といっていいぐらいのキーワード
とりあえず片っぱしから全部const付けて、どう頑張ってもここは
constはずさないと動くコードにできないよな・・ていうぐらいの
時だけはずす。このぐらいの気構えでコードを書けば、かなり安全な
コードになってる。他のやつが書きかえちゃダメなものをいじろうと
しても、強引なキャストでもしない限りどうやってもコンパイルが
通らなくなる。強引なキャストしてでも無理矢理強姦してくる強姦魔は
そもそも犯罪者気質なのでそんなやつに仕事をやらせてる時点で間違い
コードの安全性を高めるのに必須といっていいぐらいのキーワード
とりあえず片っぱしから全部const付けて、どう頑張ってもここは
constはずさないと動くコードにできないよな・・ていうぐらいの
時だけはずす。このぐらいの気構えでコードを書けば、かなり安全な
コードになってる。他のやつが書きかえちゃダメなものをいじろうと
しても、強引なキャストでもしない限りどうやってもコンパイルが
通らなくなる。強引なキャストしてでも無理矢理強姦してくる強姦魔は
そもそも犯罪者気質なのでそんなやつに仕事をやらせてる時点で間違い
540デフォルトの名無しさん
2019/02/23(土) 23:48:50.01ID:Iy1q86mj 「かなり安全な」
ここで思わず笑ってしまったではないか
ここで思わず笑ってしまったではないか
541デフォルトの名無しさん
2019/02/24(日) 00:00:52.25ID:qLJosHl4 残念ながらバカはmutable使い出すから無意味。
542デフォルトの名無しさん
2019/02/24(日) 00:06:41.22ID:2wDVhIfR 俺は書換られたりはしない たぶんしないと思う
しないんじゃないかな ま、ちょっと覚悟はしておけ
しないんじゃないかな ま、ちょっと覚悟はしておけ
543デフォルトの名無しさん
2019/02/24(日) 00:47:53.06ID:ORSkBdqU constっていちいち書くのめんどい
544デフォルトの名無しさん
2019/02/24(日) 00:48:50.68ID:haqs87u6 >>537
何を言ってるのか分かりません
何を言ってるのか分かりません
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【音楽】Perfume・あ~ちゃんの結婚相手「一般男性」は吉田カバンの社長・吉田幸裕氏(41) 高身長で山本耕史似 [Ailuropoda melanoleuca★]
- 【サッカー】U-17日本代表、激闘PK戦制す 北朝鮮撃破で6大会ぶり8強入り U17W杯 [久太郎★]
- 【インバウンド】中国人観光客の日本での消費額は年間約2兆円超…中国政府は公務員の出張取り消し [1ゲットロボ★]
- 【サッカー】日本代表、ボリビアに3発快勝 森保監督通算100試合目を飾る…鎌田、町野、中村がゴール [久太郎★]
- XやChatGPTで広範囲の通信障害 投稿や閲覧できず [蚤の市★]
- 【芸能】日中関係悪化でエンタメ業界に大ダメージ… JO1の中国でのイベント中止、邦画は公開延期、STARTOアイドルへの影響も [冬月記者★]
- アンケート調査で「高市発言は問題なし」 93.5%wwwwwwwwwwwwwwwwwwwwwwwww [279254606]
- お前らは“スカイマイルタワー”建設計画を知っているか?
- これ誰か分かるか?
- 支払い詰まってインターネット止まった
- 万引きJC「すいません許してください!何でもしますから!」←どうする?
- 5時だから窓から5回ちんこ出した
