X



C++相談室 part136
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん (ワッチョイ bf81-LHz9)
垢版 |
2018/06/07(木) 23:40:12.36ID:GNQuDMaA0
次スレを立てる時は本文の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
0350デフォルトの名無しさん
垢版 |
2018/06/19(火) 21:50:59.42
非適合コード: a = a + b + c;
適合コード: a = ( a + b ) + c;
0351デフォルトの名無しさん (ワッチョイ 4223-PZZX)
垢版 |
2018/06/19(火) 21:52:07.12ID:j1n9w5rn0
>>349
>演算にカッコを付けろという警告

メンテしてるアプリのソース内のMD5だか sha だかのコード(問題なく動作中)で
「&とシフトの優先順位わかってんのか?括弧つけたら?」の警告が出るが、
&とシフトの優先順位など知る気もないし書き換えるとバグる気しかしないので放置している。
0353デフォルトの名無しさん (ワッチョイ 42eb-m0US)
垢版 |
2018/06/19(火) 23:42:48.11ID:Ac6XacCG0
質問です
std::unique_ptrはデストラクタで保持するリソースの解放処理を行うので、自明なデストラクタを持つことが出来ず、リテラル型になることが出来ないと思うのですが
デフォルトコンストラクタとnullptrを受けるコンストラクタはconstexpr指定されています、このconstexprにはどういう意味があるのでしょうか?
0354デフォルトの名無しさん (スップ Sd62-PZZX)
垢版 |
2018/06/20(水) 00:16:23.94ID:ai7I58Bid
>>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 を使用することが出来る。
0356デフォルトの名無しさん (ワッチョイ ff9d-E6HK)
垢版 |
2018/06/21(木) 04:41:53.49ID:G2MjnjmO0
Scopeのついた#defineのような書き方ってないのでしょうか?
たとえば Uart0.baud 115200を変数としてしてじゃなくてDefineで保持しておきたい
場合にScopeを整理しておきたい。
0358デフォルトの名無しさん (アウアウカー Sa93-tQU5)
垢版 |
2018/06/21(木) 08:23:50.96ID:iolQTPDna
>>356
C++では#defineではなくconstを使うと習いました
0360デフォルトの名無しさん (ワッチョイ ff9d-E6HK)
垢版 |
2018/06/21(木) 08:52:37.07ID:G2MjnjmO0
Constはラムに配置されますからダメですよ。
それからTemplateは型を変数にしたい場合につかえるだけです。Scopeのついた
定数がないとすると、、、、、なんか使いにくいですね。
0364デフォルトの名無しさん (ワッチョイ 1f7f-GwbS)
垢版 |
2018/06/21(木) 10:43:19.88ID:1tnpfBql0
今どきdefine使ってる奴なんていたらクビだわ
0367デフォルトの名無しさん (ブーイモ MM9f-yRyg)
垢版 |
2018/06/21(木) 12:34:10.47ID:Oz+pq3ApM
>>360
組み込み向けとかでROM実行になっていなければ、どちらもRAMに配置されると思うよ。
もしもコンパイル時解決するかどうかということであれば、constでもちゃんとコンパイル時解決されるし、式(含関数)の場合はconstexprキーワードを使えばコンパイル時解決(可能なら)される。
あと、templateは型だけでなく定数も置けるよ。
0368デフォルトの名無しさん (スップ Sd1f-ddCb)
垢版 |
2018/06/21(木) 12:49:18.77ID:m6fyxFJ7d
考えるべきなのは2つ

コードの即値として使われるのか
値がある番地にマッピングされるのか
その都度関数コールで解決するのか



マッピングされる場合、どのセクションにマッピングされるのか
0369デフォルトの名無しさん (ワッチョイ 9fd2-GwbS)
垢版 |
2018/06/21(木) 13:52:00.91ID:Grok3vuS0
const定数は ヘッダーファイルで宣言するだけではダメでソースファイルでconst定数の実体を初期化しなければならないので、defineより使い勝手が悪い面もある。
最新のC/C++だとその辺どうなってんの?
0371デフォルトの名無しさん (ワッチョイ 7f23-WzrY)
垢版 |
2018/06/21(木) 13:59:26.98ID:S4IxNo+10
>>369
メンバ変数でも数値ならソース側に定義要らないから
struct SimpleMath {
const static int pi = 3;
};
でいい

実体がたくさんできるのを苦にしなければ
namespace n {
const static int pi=3;
};
でもいいし
0378デフォルトの名無しさん (ワッチョイ 7f23-WzrY)
垢版 |
2018/06/21(木) 16:40:51.05ID:S4IxNo+10
ほら試してやったぞ
アドレスが違うから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
0380デフォルトの名無しさん (ワッチョイ 7f23-WzrY)
垢版 |
2018/06/21(木) 16:50:45.19ID:S4IxNo+10
ソース中で(アドレスは使われず)値しか用いられなければ実体が全く作られない可能性もあるが
オブジェクトファイル見なきゃ確認できなくて面倒だからそれは略
0384デフォルトの名無しさん (ワッチョイ 7f23-WzrY)
垢版 |
2018/06/21(木) 17:27:13.58ID:S4IxNo+10
>>383
付けなかったらリンクエラー出るだろ

こういうとお前はバカだからヘッダーでは extern しておいて
どっかのソースに1つ実体を書けとか言い出すんだろうけど、
もともと>>371>>369の「ヘッダーだけで済ませたい」への返事だからな。

まだ他に言いたいことがあるなら日記に書け
0386デフォルトの名無しさん (スップ Sd1f-ddCb)
垢版 |
2018/06/21(木) 17:49:19.83ID:m6fyxFJ7d
#defineが一番確実
最適化も一番期待できるしCとの互換性も保てる
ってことでいまだに#defineは使う
スコープ問題は昔ながらのプレフィックスで解決

小さな組み込みマイコンだと
C++でもこんな感じ
0388デフォルトの名無しさん (ワッチョイ 1fb3-RzAk)
垢版 |
2018/06/21(木) 17:54:46.47ID:RX0X5VqW0
フリースタンディング環境の話をこっそり忍ばせてくる技の名前なんだったっけ。
0389デフォルトの名無しさん (スップ Sd1f-ddCb)
垢版 |
2018/06/21(木) 18:03:41.90ID:m6fyxFJ7d
逆に値を変えても1バイトしか変わって欲しくないときや
1バイトを無理やり変えると動作が正しく変わってほしいとき
は番地に割り当てられるようにする

PCプログラムしか書いたことがない人は気にしたことも無いだろうけど
0397デフォルトの名無しさん (ワッチョイ 7f34-MNXm)
垢版 |
2018/06/22(金) 00:28:24.33ID:JUnpVDzH0
constexprは関数が返す内容が定数であることを保証する
コンパイル時はインラインでその関数を走らせて順次定数に置き換えてコンパイルが行われるということだ
0403デフォルトの名無しさん (ワッチョイ 1fb3-RzAk)
垢版 |
2018/06/22(金) 03:26:28.59ID:0qBHNE4T0
constexprで学習した結果のみ実行時に用いるAI。
0404デフォルトの名無しさん (ワッチョイ ff9d-E6HK)
垢版 |
2018/06/22(金) 03:36:59.17ID:1CqwlerO0
結論が出たようなのでまとめる
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 を使って綺麗に書いてみよう。任せる。
0407いちるいなんがずっとだしおっかけてついてくるし (ワッチョイ 1f76-lC4z)
垢版 |
2018/06/22(金) 06:11:32.65ID:kyYAMp480
でふぁいん てんてきのしんにゅう がちょくじゃないから あんしんするじゃないかな


めいんすとりーとからいっぽんはいったほうが
0408デフォルトの名無しさん (ワッチョイ 1f76-lC4z)
垢版 |
2018/06/22(金) 06:13:05.67ID:kyYAMp480

0409デフォルトの名無しさん (ワッチョイ 1f76-lC4z)
垢版 |
2018/06/22(金) 06:15:15.42ID:kyYAMp480
カチグミニチカイホウガアブナイヨネここはあんぜんしゅうだんすとーかーにとっては

てんごく あんじゅうのち
0410デフォルトの名無しさん (アウアウウー Sae3-E6HK)
垢版 |
2018/06/22(金) 06:44:34.82ID:1fAWv7Tna
適当
https://ideone.com/3pPDGA
0411デフォルトの名無しさん (ブーイモ MM0f-mx2r)
垢版 |
2018/06/22(金) 07:48:57.63ID:jUqm4dE5M
>>402
constexprはコンパイル時評価可能(評価するとは言っていない)なのでコンパイラ依存。
コンパイル時間が伸びるのが大半だろうけど。
0414デフォルトの名無しさん (スップ Sd1f-ddCb)
垢版 |
2018/06/22(金) 09:02:09.74ID:bJNd9Nrpd
>>411
「とても」ってのは例えば10年かかるとかそういうの
ある数学定数の計算とか固定データの暗号化を破るプログラムとか

適度にあきらめてくれないと
コンパイルが(事実上)出来なくなる
0417デフォルトの名無しさん (ワッチョイ 7f23-eNWv)
垢版 |
2018/06/22(金) 14:23:31.03ID:0acoPbmK0
>>385
リンカの挙動に付いては変数と扱いが違うせいじゃなくて
c++ では const 変数はデフォルトで static なくだけだよ

お前は正しい指摘をしている時でさえ必ず間違ったことを言う
このスレ読んでる人に嘘ついて喜んでる愉快犯か何かか
0418デフォルトの名無しさん (スプッッ Sd1f-SNrP)
垢版 |
2018/06/22(金) 14:25:48.43ID:oyBTubw6d
現代においてdefineを使う利点がゼロ
0419デフォルトの名無しさん (ワッチョイ 7f34-MNXm)
垢版 |
2018/06/22(金) 14:31:22.11ID:JUnpVDzH0
は?constをヘッダにstaticで定義しているバカが居たことに驚きなんだが
そりゃstaticで定義しまくったら実体増えるのは当たり前だろ
灯台下暗しでstatic記述するバカに気付かなかったわ
バカ過ぎて話にならんわw
0420デフォルトの名無しさん (ワッチョイ 9fd2-GwbS)
垢版 |
2018/06/22(金) 15:00:35.31ID:PS4w2oBw0
>>419
おっしゃることは確かにもっともなことですが、basic_string::npos についてはどう思われますか?
0424デフォルトの名無しさん (ワッチョイ 1fb3-RzAk)
垢版 |
2018/06/22(金) 18:20:27.94ID:0qBHNE4T0
一行おきになってから考える。
0426デフォルトの名無しさん (ワッチョイ 9fd2-GwbS)
垢版 |
2018/06/22(金) 19:10:51.02ID:PS4w2oBw0
>>422
クラス変数に統合されるとなぜ問題ないのですか?
そもそも統合とはどういう状態でしょうか。
ネームスペースにstatic constを書くのとあまり違いはないように思うのですが、どう違うのか教えてもらえませんでしょうか。
0432デフォルトの名無しさん (ワッチョイ ff0d-GwbS)
垢版 |
2018/06/22(金) 21:16:32.93ID:sLKAbUw90
   ___
  /彡彡))
  |彡( >
  ノノノ ヽ丿 <プロでござい
 / ̄ ̄ ̄\  n_
`/| _[]_ |/\ ( )
∧||バ| Y\ `/ /
\||カ| | \_/
(|  ̄ ̄ |
 |____|
 ||_|i|_||
 | ー|ー |
0436デフォルトの名無しさん (ワッチョイ 7fd2-XQuB)
垢版 |
2018/06/22(金) 23:02:52.73ID:tZy0W+/k0
まじめにデザインパターンを学習したくて書籍を探しているのですが、Javaで
説明しているものばかりで困っています。Javaは全く知りませんし、覚えるつ
もりもありません(自分にとっては不要な言語なので)。

C++でデザインパターンを開設している書籍を教えてください。
0438デフォルトの名無しさん (ワッチョイ 7f7e-09r9)
垢版 |
2018/06/22(金) 23:40:54.94ID:m8knQ0QO0
サンプルがJavaで書いてあるかどうかって関係あるか?
デザパタの本ならJava特有のことはやってないはず
何をやっているのかを理解してそれをそのまま他の言語に当てはめればいい
0445 ◆QZaw55cn4c (ワッチョイ 7f60-DJU/)
垢版 |
2018/06/23(土) 00:19:38.99ID:OlLfOCSW0
>>436
結城ならば簡単なJava だから、C++ の知識で Java の字面は追えますよ(なんとなくわかる)
私は結城 Java を C++ に書き直して習得しました
0446デフォルトの名無しさん (ワッチョイ ff9d-E6HK)
垢版 |
2018/06/23(土) 02:15:46.97ID:nmsTY6vF0
C#やJavaが動くのにC++を使うのは辛い。非常につらい。絶対にやめたい。にも拘らず
未だにC++を進める人がいるのは残念だ。
一方C++は組み込みには非常に威力を発揮する。しかし組み込みではいまだに90%
の人がCを使う。それはなぜなのか?
 CとC++ではスッポンと月ほどの違いがある。しかし残念ながらそれは
C++をフルに使える場合であって、フルに使える場合ならC#やJAVAを使った方がいいわけで
フルに使えないケースであるからこそ、C++を使うのが正しいのであるから、やはりC++は
Cに比べて月ほどではない。しいて言えば月というよりは牛だろう。ともすれば牛よりも
スッポン料理が高価なように、月になれるのに牛ではやはりかなり残念なのである。
どういう切り口でも残念な言語、それがC++だ。
0447デフォルトの名無しさん (ワッチョイ ff9d-E6HK)
垢版 |
2018/06/23(土) 02:24:54.31ID:nmsTY6vF0
C++開発をした人がC++の本を書いていて、先輩に「読め!!!」と勧められたので読んで
みたが非常にわかり難い。こんな頭の構造をした人が作った言語だからきっとわかり難いの
だろうと思う。一言でいうと簡単なことを複雑に説明する。
C++という言語もアフォほど簡単なことをやたらと複雑に書かなければならないことが多い
という気がする。
0448デフォルトの名無しさん (ワッチョイ ff9d-E6HK)
垢版 |
2018/06/23(土) 02:33:48.53ID:nmsTY6vF0
Headerファイルにメソッドを書かないスタイルは誤りだ。
理由
1.C++以外でそんなスタイルをとっているものはない。
2.なぜならメソッドも実体ではなく型だからだ。分離するメリットはないがデメリットは多い。
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況