C++相談室 part136
■ このスレッドは過去ログ倉庫に格納されています
次スレを立てる時は本文の1行目に以下を追加して下さい。 !extend:on:vvvvv:1000:512 C++に関する質問やら話題やらはこちらへどうぞ。 ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。 前スレ C++相談室 part135 https://mevius.5ch.net/test/read.cgi/tech/1522495206/ このスレもよろしくね。 【初心者歓迎】C/C++室 Ver.102【環境依存OK】 http://mevius.5ch.net/test/read.cgi/tech/1509780815/ ■長いソースを貼るときはここへ。■ http://codepad.org/ https://ideone.com/ [C++ FAQ] https://isocpp.org/wiki/faq/ http://www.bohyoh.com/CandCPP/FAQ/ (日本語) ----- テンプレ ここまで ----- VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured 俺の中のうざい警告 使わない引数、変数、関数の警告 セキュリティ関連 演算にカッコを付けろという警告 非適合コード: a = a + b + c; 適合コード: a = ( a + b ) + c; >>349 >演算にカッコを付けろという警告 メンテしてるアプリのソース内のMD5だか sha だかのコード(問題なく動作中)で 「&とシフトの優先順位わかってんのか?括弧つけたら?」の警告が出るが、 &とシフトの優先順位など知る気もないし書き換えるとバグる気しかしないので放置している。 質問です std::unique_ptrはデストラクタで保持するリソースの解放処理を行うので、自明なデストラクタを持つことが出来ず、リテラル型になることが出来ないと思うのですが デフォルトコンストラクタとnullptrを受けるコンストラクタはconstexpr指定されています、このconstexprにはどういう意味があるのでしょうか? >>353 https://stackoverflow.com/questions/30766103/why-declare-constrexpr-constructors-for-classes-with-non-trivial-destructors-e/30766445#30766445 によれば constexpr でないコンストラクタよりも先に(恐らくはコンパイル時に静的に)初期化されるので、 例えばグローバル変数 foo apple; unique_prt<T> orange; とあるとき 初期化順を気にせず apple のコンストラクターの中で orange を使用することが出来る。 >>354 リテラル型とまではいかないにしてもコンパイル時に初期化してくれるんですか、なるほど ありがとうございます Scopeのついた#defineのような書き方ってないのでしょうか? たとえば Uart0.baud 115200を変数としてしてじゃなくてDefineで保持しておきたい 場合にScopeを整理しておきたい。 template<int baud> class Uart0 { >>356 C++では#defineではなくconstを使うと習いました 先生!プリプロセッサで完結する処理もconstを使うのですか? Constはラムに配置されますからダメですよ。 それからTemplateは型を変数にしたい場合につかえるだけです。Scopeのついた 定数がないとすると、、、、、なんか使いにくいですね。 名前空間 にconst定数を閉じ込めて、スコープ内で using namespace xxx; を宣言して名前空間を明示せずに定数にアクセス。 defineをconstに書き換えるぐらいなら別の言語使いますよね。 クビにできる立場の人がソースコードチェックしてる会社なんですね。労組がないとかただの派遣屋ですね^^ 整数に関しては遥か昔から enum がスコープ付き定数として使われてただろ >>360 組み込み向けとかでROM実行になっていなければ、どちらもRAMに配置されると思うよ。 もしもコンパイル時解決するかどうかということであれば、constでもちゃんとコンパイル時解決されるし、式(含関数)の場合はconstexprキーワードを使えばコンパイル時解決(可能なら)される。 あと、templateは型だけでなく定数も置けるよ。 考えるべきなのは2つ コードの即値として使われるのか 値がある番地にマッピングされるのか その都度関数コールで解決するのか と マッピングされる場合、どのセクションにマッピングされるのか const定数は ヘッダーファイルで宣言するだけではダメでソースファイルでconst定数の実体を初期化しなければならないので、defineより使い勝手が悪い面もある。 最新のC/C++だとその辺どうなってんの? >>369 メンバ変数でも数値ならソース側に定義要らないから struct SimpleMath { const static int pi = 3; }; でいい 実体がたくさんできるのを苦にしなければ namespace n { const static int pi=3; }; でもいいし >>369 関連してついでに言うとよほど古いコンパイラじゃなければ struct T { int k=0; }; というメンバ変数の初期化の書き方もできて 複数のコンストラクタがあるときとか楽できるよ 実体が沢山出来るとか馬鹿かテメーは それが事実ならリンク時にエラー大量発生しとるわ >>376 人をバカにしたい意識が強すぎるから static 変数は 外部リンケージを持たないなんて基本も忘れるんだよ。 ほら試してやったぞ アドレスが違うから2個あるのがわかるだろ? MacBook-Pro:tmp$ cat a.h namespace a { static const int b = 8; }; MacBook-Pro:tmp$ cat a0.cpp #include <cstdio> #include "a.h" extern void foo(); int main() { foo(); printf("main %lx\n", (long) &a::b); } MacBook-Pro:tmp$ cat a1.cpp #include <cstdio> #include "a.h" void foo() { printf("foo %lx\n", (long) &a::b); } MacBook-Pro:tmp$ c++ a0.cpp a1.cpp MacBook-Pro:tmp$ ./a.out foo 10925bfb0 main 10925bfac ソース中で(アドレスは使われず)値しか用いられなければ実体が全く作られない可能性もあるが オブジェクトファイル見なきゃ確認できなくて面倒だからそれは略 クラステンプレートにしておけば (そして型引数が同じであれば) リンクのときにインスタンスが統合されるので、それを利用できるかもね。 >>381 クラス使うなら普通に>>371 の上の方で良いかと思う >>377 だからよう、なんでstatic付ける必要あるんだよ 付けなければ実体一つで済むだろ馬鹿かテメーは >>383 付けなかったらリンクエラー出るだろ こういうとお前はバカだからヘッダーでは extern しておいて どっかのソースに1つ実体を書けとか言い出すんだろうけど、 もともと>>371 は>>369 の「ヘッダーだけで済ませたい」への返事だからな。 まだ他に言いたいことがあるなら日記に書け >>384 出ねぇよ馬鹿かテメーは変数と扱い違ぇんだよ #defineが一番確実 最適化も一番期待できるしCとの互換性も保てる ってことでいまだに#defineは使う スコープ問題は昔ながらのプレフィックスで解決 小さな組み込みマイコンだと C++でもこんな感じ と、クソ雑魚老害がさえずってます せめてenumにしろよ雑魚 フリースタンディング環境の話をこっそり忍ばせてくる技の名前なんだったっけ。 逆に値を変えても1バイトしか変わって欲しくないときや 1バイトを無理やり変えると動作が正しく変わってほしいとき は番地に割り当てられるようにする PCプログラムしか書いたことがない人は気にしたことも無いだろうけど #defineアレルギー gotoアレルギー printfアレルギー この板には多い mainと言う文字列見ると、猛烈に指先がかゆくなる もはやドライバ書くときしかC++使わないし、最近のC++機能は全部いらね 老害とか言ってる奴の用途なんて元々、JavaやC#で十分だろ 内容あまり理解してないがconstexprは論外なのか 定数意外の計算(変数なんかが含まれる)とコンパイルエラーになる。 constexprは関数が返す内容が定数であることを保証する コンパイル時はインラインでその関数を走らせて順次定数に置き換えてコンパイルが行われるということだ constexprは変数も定義可能だから今回の内容なら名前空間にconstexpr変数を定義すればokかなと思ってたり... まあそういうこったな どんだけ糞長い関数書こうとその関数を呼び出した時点で定数に置換されてコンパイルされる constexprだけど計算にとても時間がかかる場合はどうなるんだろう 延々とコンパイルが終わらないとかエラーになるとか勝手に実行時解決になるとか? constexprで学習した結果のみ実行時に用いるAI。 結論が出たようなのでまとめる 1.#defineは欠点が多い。スコープが効かないのでC++では基本的に使わないこと。 2.代わりにconstexprを使う。constexprは、汎用的に定数式を表現するための機能である。 constexprは、「constant expression (定数式)」の略語である。 例1 #define BIT(n) (1<<n) これは汎用性が高いので書き換える必要はないようにも思えるが、正しくは constexpr int BIT(int n){ return 1 << n; } このように書かなければならない。 例2 #define UART_A0_baud (115200) #define UART_A0_stop (1) #define UART_A0_bit (8) #define UART_A0_parity (0) #define UART_A1_baud (9600) #define UART_A1_stop (2) #define UART_A1_bit (8) #define UART_A1_parity (1) これをconstexpr を使って綺麗に書いてみよう。任せる。 C++書けるやつはかっこいいな- ただ俺が書こうとしてないだけだけど でふぁいん てんてきのしんにゅう がちょくじゃないから あんしんするじゃないかな めいんすとりーとからいっぽんはいったほうが カチグミニチカイホウガアブナイヨネここはあんぜんしゅうだんすとーかーにとっては てんごく あんじゅうのち >>402 constexprはコンパイル時評価可能(評価するとは言っていない)なのでコンパイラ依存。 コンパイル時間が伸びるのが大半だろうけど。 >>411 確実にコンパイル時に解決されてるためには 別プログラムで計算して即値を#defineがベストって事だな >>411 「とても」ってのは例えば10年かかるとかそういうの ある数学定数の計算とか固定データの暗号化を破るプログラムとか 適度にあきらめてくれないと コンパイルが(事実上)出来なくなる >>413 そこは即値をconstexprにしようぜ。 >>404 constexprならunsignedじゃなくても平気なのかな? >>385 リンカの挙動に付いては変数と扱いが違うせいじゃなくて c++ では const 変数はデフォルトで static なくだけだよ お前は正しい指摘をしている時でさえ必ず間違ったことを言う このスレ読んでる人に嘘ついて喜んでる愉快犯か何かか は?constをヘッダにstaticで定義しているバカが居たことに驚きなんだが そりゃstaticで定義しまくったら実体増えるのは当たり前だろ 灯台下暗しでstatic記述するバカに気付かなかったわ バカ過ぎて話にならんわw >>419 おっしゃることは確かにもっともなことですが、basic_string::npos についてはどう思われますか? なお、std::dec, std::hex なども static const。 クラス変数は統合されるから問題ない ネームスペースやグローバルのヘッダに書くstatic constと違って constexprをご存知でない人多すぎでは 入門書に1ページおきにこれを使えと書いてあるだろ >>418 アホ自慢? >>423 入門書www プロは知ってても、場合によって#defineを使う >>422 クラス変数に統合されるとなぜ問題ないのですか? そもそも統合とはどういう状態でしょうか。 ネームスペースにstatic constを書くのとあまり違いはないように思うのですが、どう違うのか教えてもらえませんでしょうか。 static constexprにするかstatic inlineにするかテンプレートクラスに書けば実体はただ一つになると思う 普通に書いたら分裂しそう cとの互換性を無視した場合のdefineの利点てあるのですか? >>428 ソースコードをプリプロセスしたいときに使う ___ /彡彡)) |彡( > ノノノ ヽ丿 <プロでござい / ̄ ̄ ̄\ n_ `/| _[]_ |/\ ( ) ∧||バ| Y\ `/ / \||カ| | \_/ (|  ̄ ̄ | |____| ||_|i|_|| | ー|ー | >>429 かならずインラインになる保証はないのでは? >>421 を訂正。 std::dec, std::hex はマニピュレータなので定数じゃなかった。 定数なのは、std::ios_base::dec、std::ios_base::hex。 まじめにデザインパターンを学習したくて書籍を探しているのですが、Javaで 説明しているものばかりで困っています。Javaは全く知りませんし、覚えるつ もりもありません(自分にとっては不要な言語なので)。 C++でデザインパターンを開設している書籍を教えてください。 >>436 gofっていうわりとデザパタに詳しい人も本出してるから探してみて。 サンプルがJavaで書いてあるかどうかって関係あるか? デザパタの本ならJava特有のことはやってないはず 何をやっているのかを理解してそれをそのまま他の言語に当てはめればいい C++は反則技が多すぎるので勉強しても無駄。 常に速度やメモリ効率を重視するための言語。 高級言語でOOしたいなら素直にJavaを使うべし。 今日日、Java使うくらいならPythonを使うんじゃないの。 JavaとPythonとC++って全部用途が違うじゃん Javaと競合してるのはC# >>436 結城ならば簡単なJava だから、C++ の知識で Java の字面は追えますよ(なんとなくわかる) 私は結城 Java を C++ に書き直して習得しました C#やJavaが動くのにC++を使うのは辛い。非常につらい。絶対にやめたい。にも拘らず 未だにC++を進める人がいるのは残念だ。 一方C++は組み込みには非常に威力を発揮する。しかし組み込みではいまだに90% の人がCを使う。それはなぜなのか? CとC++ではスッポンと月ほどの違いがある。しかし残念ながらそれは C++をフルに使える場合であって、フルに使える場合ならC#やJAVAを使った方がいいわけで フルに使えないケースであるからこそ、C++を使うのが正しいのであるから、やはりC++は Cに比べて月ほどではない。しいて言えば月というよりは牛だろう。ともすれば牛よりも スッポン料理が高価なように、月になれるのに牛ではやはりかなり残念なのである。 どういう切り口でも残念な言語、それがC++だ。 C++開発をした人がC++の本を書いていて、先輩に「読め!!!」と勧められたので読んで みたが非常にわかり難い。こんな頭の構造をした人が作った言語だからきっとわかり難いの だろうと思う。一言でいうと簡単なことを複雑に説明する。 C++という言語もアフォほど簡単なことをやたらと複雑に書かなければならないことが多い という気がする。 Headerファイルにメソッドを書かないスタイルは誤りだ。 理由 1.C++以外でそんなスタイルをとっているものはない。 2.なぜならメソッドも実体ではなく型だからだ。分離するメリットはないがデメリットは多い。 ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.1 2024/04/28 Walang Kapalit ★ | Donguri System Team 5ちゃんねる