質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

3386閲覧

VC++ class内の定義について

nicoyou

総合スコア129

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2018/12/08 06:05

win環境のC++で以下の書き方は良くないという記事を見たのですが

C++

1class test : public Task() 2{ 3#define DEF_MAX 1000 4#define VER "1.0.0" 5public: 6//~~~ 7}

1.どのように書けばいいのでしょうか?
2.実際に何が良くないかを教えてくださいm(__)m
intの方はいったんこのように書き換えました
文字列の書き換え方は思いつきませんでした

C++

1class test : public Task() 2{ 3static const int DEF_MAX = 1000; 4public: 5//~~~ 6}

継承クラスであることに深い意味はありません
以前見たサイトは忘れてしました

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

こんにちは。

定数定義にマクロを使う場合の問題としては、デバッガがその中身を表示できないのでデバッグに苦労することが主と思います。

数値型の定数は、マクロで使いたくなるケースは稀なのでconstやconstexprで定義した方が良いと思います。
文字列型の定数(上記のVER)については議論の余地があると思います。マクロなら文字列定数の結合をコンパイル時に分かりやすい構文で行えるので、デバッグ時に中身を見たいか、文字列定数の結合をしたいかにより選択するのも手かと思います。

ちなみに文字列定数の結合は、例えば、以下のような話です。

C++

1#define PROGRAM_NAME "HogeHoge" 2#define VERSION "1.0.0" 3 : 4std::cout << PROGRAM_NAME " Version " VERSION << std::endl

HogeHoge Version 1.0.0と表示されますが、この文字列はコンパイル時に結合され、1つの文字列として処理されます。

最後に文字列定数をC++定数として記述するには、C++11以降ならば下記のどちらでもOKなようです。
普通はクラス外で改めて定義と初期化が必要です。

C++

1static constexpr char const* VER="1.0.0"; 2static constexpr const char* VER="1.0.0";

投稿2018/12/08 06:30

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nicoyou

2018/12/08 08:09

ご回答ありがとうございます #defineを使うメリットもあるのですね ただ、多用する定義ではないのでstatic constexprの方法を使おうと思います
guest

0

C→C++になってマクロはほとんど不要になりました。定数定義はenum,constが主流です。
#defineで定義されるマクロは単純な文字の置き換えです。従って、コンパイラは元の構文がどうなっていたのかを知ることが出来ません。これは、デバッグ時にその定数が「どうやって作られたものなのかを知ることが出来ない」ということです。そのた、文字列置き換えにまつわる問題が有ります。
#define POW(x) x++ * x++
はどうなるでしょう?

文字列の書き換え方は思いつきませんでした

については、以下を参照
文字列定数についてです。

投稿2018/12/08 06:23

cateye

総合スコア6851

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nicoyou

2018/12/08 08:11

ご回答ありがとうございます #defineをマクロとして使ったことはほぼないので問題が起こるかどうかはわかりませんが、理由はわかりました
guest

0

ベストアンサー

1.どのように書けばいいのでしょうか?

inline constexprを用います。ただしC++17を有効にしてください。

cpp

1class test : public Task 2{ 3 inline constexpr std::size_t def_max = 1000; 4 inline constexpr const char* ver = "1.0.0"; 5public: 6//~~~ 7}

2.実際に何が良くないかを教えてくださいm(__)m

マクロはスコープが関係ないので、

cpp

1#define DEF_MAX 1000 2#define VER "1.0.0" 3 4class test : public Task 5{ 6 7public: 8//~~~ 9}

と書いたのと同じことになります。つまり名前衝突の可能性があったりするわけですね。というかそもそもC++でマクロを使うことは推奨されていません。

static const int DEF_MAX = 1000;

C++03のころならこう書いていましたが、C++11よりconstexprが、C++17よりinline変数があります。

投稿2018/12/08 06:14

編集2018/12/08 06:15
yumetodo

総合スコア5850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nicoyou

2018/12/08 06:18

ご回答ありがとうございます 2番については凄くわかりやすかったのですが、inline constexprというものを知らないのでこれについて調べてきます >>C++03のころならこう書いていましたが (私が見た記事は古いものだったんですね....)
yumetodo

2018/12/08 06:18

リンク先をぜひ読んでください!
yumetodo

2018/12/08 06:19

C++界隈は古い情報や誤った情報が多いのである程度cpprefjpなどで状況を追っておいたほうがいいかもしれませんね
nicoyou

2018/12/08 08:07

貼っていただいたリンクは読んできたのですが専門用語が多く、うっすらと理解するのが限界でした わざわざC++17にあげて(現在のは17ではなかった)lnlineを使う必要性を見いだせなかったのでC++11の方の方法で書こうと思います
yumetodo

2018/12/08 08:37

primitiveな型じゃない場合ヘッダーファイルにクラス定義を書くときにstaticメンバー定義を別のところに書かないと多重定義になってしまうという問題の解決としてinlineがあるので、それに該当しなければ不要ですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問