現在下記のようなソースコードに対して、
静的解析ツールから指摘が出ています。
C++
1// header.h 2namespace TMP_NAME 3{ 4static constexpr quint8 TEISU_A = 10; // この行に対して指摘 5static constexpr quint8 TEISU_B = 20; // この行に対して指摘 6} 7
指摘内容は以下になります。
ヘッダファイル内で領域獲得をしています。(変数"TEISU_A") ヘッダファイル内で領域獲得をしています。(変数"TEISU_B")
指摘の詳細説明については以下になります。
[意味] ソースファイルから#include文で取り込まれたインクルードファイルで、領域獲得の変数定義あるいは関数定義を行っています。 インクルードファイルは、複数のソースファイルから取り込まれることを前提にしたファイルです。 このためインクルードファイルで領域獲得を行うと、外部変数や普通の関数の場合はリンクエラーが発生します。 また、静的変数や静的関数の場合は複数の領域が確保されてしまいます。 [対処方法] 複数のファイルで共通に使用する変数や関数の場合、インクルードファイルではextern変数宣言や関数宣言を行い、1つのソースファイルで領域獲得の変数定義や関数定義を行いましょう。 1つのファイルで使用する変数や関数の場合は、インクルードファイルでの変数定義や関数定義は削除し、ソースファイル毎に領域獲得するstatic変数定義やstatic関数定義を記述しましょう。
まず、この静的解析ツールの注意点として、C++11以上に対応できていないため、
C++11から追加されたキーワードや構文を認識できません。
なのでC++11以上の機能については誤指摘が発生するという問題があります。
その上で、指摘の詳細説明については十分に理解して、確かにその通りでヘッダ内で領域確保は問題だろうな
とは思ったのですが。
今回指摘が出ている部分はC++11からの機能であるconstexpr
についてのため
この指摘が本当に適用されるものなのか、無視しても問題ないものなのかということについて悩んでいるところです
**constexpr
は(可能なものであれば)コンパイル時定数として扱われて、領域というものが無いと思っていたので、
この指摘は無視しても大丈夫なのか?**と悩んでいます。
これがコンパイル時定数として扱われないものなのであれば、指摘は無視できないでしょうが
今回のconstexpr
の使用用途はただの定数定義あるため、基本的にはコンパイル時定数として扱われるだろうと思っておりますが、
知識が浅いため判断することが出来ません...
このソースコードに対しての指摘は、無視しても大丈夫なものなのかどうか
分かる方がいらっしゃいましたら教えていただけませんでしょうか?
また、今回のようにヘッダファイル内に直接constexpr
で定数定義しているのは
単純に、全体で使えるような定数を定義したかったからなのですが
このような使用方法、定義方法は一般的には有りなのか無しなのかを知りたいです。
もし全体で使用する定数を定義する場合でも
それ用のクラスを用意してその中に定義をするべきなのかどうかなども悩んでいます。
皆さんのコーディング方法などを聞いてお勉強させてください
よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/10/29 08:46