いくつかの点を明確にする必要があります。たとえば、次の行です。
#if !WIN32
/DWIN32=1
は実際には標準によって明確に定義されており、コンパイラの呼び出しに常にまたはが含まれている場合は、合理的に使用できます-DWIN32=0
。さらに言えば、標準では、定義されていないシンボルはマクロ展開中に置き換えられるとされているため、他の規則でシンボルはWindowsマシンでのみ定義されると規定されていない限り0
、行に問題はありませんが、値は指定されていないように定義されています。その場合、次のようなものが必要です。
#ifndef WIN32
結局、それはコンパイラの依存関係を処理するために確立した規則に依存します。
一方、直後の行はULONG_MAX
、CおよびC ++標準で定義されている記号()を定義しているため、避ける必要があります。ここでの3行のシーケンスは、次のように置き換える必要があります。
#include <limits.h>
2番目の質問に関しては、エラーがMISRAルールの誤解ではないかどうかはわかりません。C ++では、const
デフォルトで内部リンケージを意味します。ヘッダーでこのようにシンボルを定義すると、変数の複数のインスタンス化が発生します(各変換単位で異なるアドレスを使用)が、複数の定義で問題は発生しません。また、代替案にも欠点があります。ここでの私の好みは、変数定義をマクロに置き換えることです。
#define CompanyName "mycompany"
しかし、マクロには独自の問題があります。シンボルextern
を宣言し、それを1つの(そして1つだけの)ソースファイルで定義することも別の方法ですが、これには2つの異なるファイルでの2つのステートメントが含まれ、(変数が果たす役割に応じて)1つが望ましい場合があります。(名前から判断すると、2つのステートメントが問題になることはないと思いますが、ヘッダーにテキストを表示したままにしておくことが望ましい場合もあります。)書いたままにしておくことも実行可能です。あなたの会社がそれに対して厳格な規則を持っていない限り、代替案。
最後の点に関しては、式は符号付きの0
タイプを持っています。int
タイプを明確に指定できます0UL
が、率直に言って、これは必須ではありません。0
タイプ0
に関係なく、タイプを強制したい場合もありますが、算術演算が特定の方法で行われるようにするために、これはそれらの1つではありません。エラー/警告に関しては、これもMISRAルールの誤解であると思われます。符号を変更する暗黙の変換は問題になる可能性がありますが、変換されるものが非常に小さい非負の定数整数である場合は問題になりません。だから書く0UL
会社の規則を順守する必要があるが、これが愚かなことをしていることを理解してください。基本的に健全な規則が関連性のない場合に適用される場合です。