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 実体が沢山出来るとか馬鹿かテメーは
それが事実ならリンク時にエラー大量発生しとるわ >>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.なぜならメソッドも実体ではなく型だからだ。分離するメリットはないがデメリットは多い。 >>446
コピペかと思ったけど違うのか
何でC#を使うべきケースとC++を使うべきケースを分けられない人が出てくるんだ?
インタープリタやC#やらがクソ簡単に書けるのはその下で煩わしいことをやってくれてる人がいるからだ 最近の勘違いしたアホ機能テンコ盛りのC++。なんでも書けますよ。 c++が複雑なのはわかるがどんどん簡単に書けるように進歩してるだろ。
autoとかrange-based for loopとかconstexprとかlambdaとか。
他の言語並みに簡単に書けるようになるのはまだまだかかるとは思うが。 使う気ないですけどね。速度が速くならないならいらないです。
使い捨て、楽したいならC#で十分ですからね。 >>454
今どきはtypedefじゃなくてusingだしconstは実体が増えるからconstexprにするべきだと思うのだがどうだろう? セットする値に singned int の範囲しか使わないなら、static const 定数じゃなくて enum でOK。
enum なら constexpr すら要らない。 enum baseってlong long使えないんだっけ? >>444
Javaは高価な機器を買わせるためにデザインされた言語だから用途が違うけど、他はソフトウェアを作るためでは? C++やるのにテンプレート使わないなんてただのマゾプレイ 小規模マイコンのソフト開発なんて
全てがマゾプレイみたいなもんだから
それでもCよりはC++の方が便利 >>462は正しいと思うけど>>461のようにテンプレートだらけになるのはどうかと思う Expression templateでmatrix乗算、それが無理ならベクトルの内積
(それもコンパイル時計算じゃなくてコンパイラの遅延評価を利用して
一種の構文を記憶したもの)を計算するETを解説してるところしらないかな。
ベクトルのETによる遅延評価計算はC++テンプレートテクニックあるから
いいけどさ。
Matrixがわからんのよ。uBLAS、MET、TVMET探してもそれらしきソースコード
が特定できん。 Expression templateは本命じゃない。難しすぎる。でも演算子オーバーロードの
弱点である一時オブジェクトによるロス(a*aみたいな乗算も含めて)を解決する
方法を20年以上前に考えたけど、それと速度を比較したい。 ユニバーサル参照で一時オブジェクトの問題は片付く? 売ってる車輪の中から探すよりも作った方が早かったり安かったりぴったりな車輪になったりする アプリ次第じゃね。
数値計算やアルゴリズムやってると、リソース、速度、必要精度に応じて、整数、浮動小数点、多倍長整数、有理数等々に対応できるように作るから、むしろテンプレしかない。 >>470
うまい。プログラムがテンプレートだらけになってる奴は必死にマイレゴブロックを作ってる。
stl、boost、atl、既成レゴブロックは数多く提供され使われてるのだ。
そんなに理想の車輪がほしければ、
それこそ新言語を作ればいい。C++にアホ機能追加してる糞どもに言いたい。 ■ このスレッドは過去ログ倉庫に格納されています