文字列の定数を定義する方法について悩んでいます。
以下のコードの方法1と方法2では、どちらがよいのでしょうか?
それとももっと良い定義の方法があるのでしょうか?
ご教授頂けたら幸いです。
// 方法1 #define STR "abc" // 方法2 namespace constant { constexpr char str[] = "abc"; }
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
ベストアンサー
用途やコーディング規約次第で一概に何がいいとは決まらないと思います。
CのソースコードとC++のソースコードを併用するようなプロジェクトの場合は両方で使えるようにするには方法1にするしかありません。
C++のだけのプロジェクトだったら方法2で統一でもいいと思います。namespaceが使えて便利ですし。
方法1と方法2を併用する方法もあります。
あとdefineだと文字列リテラルを結合できたりします。これは方法2ではできないです。
C
1// 方法1 2#define STR1 "abc" 3#define STR2 "def"
C++
1// 方法2 2namespace constant 3{ 4 constexpr char str[] = STR1 "-" STR2; // "abc-def" 5}
投稿2019/08/28 13:18
総合スコア1627
0
C++ はプリプロセッサの利用をなるべく少なくする方向に進歩しています。 C++17 ではインライン変数を使うという選択肢もあります。
プログラムの内容を理解せず字句を置き換えるだけのマクロはそれを利用したい場面も有るものの有害なことが多いとも考えられており、特にマクロの性質が必要であるような場面を除いては、つまりどちらでもよい場面ではマクロを使わない選択をするのが現代的なスタイルと言えるとは思います。
が、そうは言ってもマクロの性質が必要な場面もまだあるのも確かなので、結局のところはきちんと用途を見極めましょうという無難な結論になっちゃいますね。
投稿2019/08/28 14:45
総合スコア5675
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/08/29 07:05
2019/08/29 12:50
0
こんにちは。
私は #define の方をよく使います。
下記のようにスムーズに結合できるので結構重宝しています。
C++
1#include <iostream> 2 3#define APP_NAME "FooApp" 4#define VERSION "1.0" 5 6int main() 7{ 8 std::cout << APP_NAME " v" VERSION; 9}
投稿2019/08/28 13:11
総合スコア23272
0
constexpr char str[] = "abc";
ではメモリ上にその領域が確保されますが、
define の方はそれはありません。
ましかし、そいつを何度も使う場合には、constexpr のほうはその領域(のアドレス)が使い回されるだけですが、
defineの方はその都度メモリに展開され、その結果無駄にメモリを使うことになります
#ましかし、最近のコンパイラは賢いので、一つの領域で済まされるってこともあったり
投稿2019/08/28 13:04
総合スコア88024
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/08/28 14:33