当社の静的解析ツールは、重複した文字列(テキストリテラル)があることを示しています。問題は、多くの翻訳単位(ソースファイル)に広がっていることです。ベストプラクティス - 複数の翻訳単位に重複したテキストリテラルを統合
例えば、文字列「NULLコンソールポインタが」module_b.cとmodule_f.cで1時間、module_a.cで5回1回存在します。
また、グローバル変数がないことを示すコードガイドラインもあります。
ヘッダファイルには変数を持たない方がよいでしょう。定数テキストの統合は、他の目的のために部屋を提供(と高速プログラムの負荷を作る)しますので、
当社のプラットフォームは、組み込みシステムです。言い換えれば、テキストリテラルのインスタンスは1つだけでなければなりません。
ので、複数の翻訳単位間で一定のテキスト・リテラルを統合するための効率的な設計やアーキテクチャは何ですか?
重複は、このような文字列"\r\n"
?
。
として(統合価値がない長さの制限はあります(注:この時点で、テキストを複数の言語に翻訳される必要はない。)
言語:CとC++(コードベースC++よりもC言語です)。
プロセッサ:ARMのCortex A8
プラットフォーム:組込みシステム、安全性と品質と性能の重要な(医療機器)。
コンパイラ:IAR Embedded Workbench(ARMプロセッサ用)。
編集1:リンカ
を統合ない私は、BINファイルをスキャンし、それが「NULLコンソールポインタ」の複数のインスタンスを含んでいます。
リンカオプション「の重複部分をマージ」と私はそれを確認しています。バイナリにはまだ重複が含まれています。あなたはいけない、懸念は文字列リテラルについてのみである場合
// header file
struct text
{
static const char* hello_world();
};
// one source file
// #include "text.hpp"
const char* text::hello_world() {
static const char _[] = "Hello, World";
return _;
}
// use case
// #include "text.hpp"
#include <iostream>
int main()
{
std::cout << text::hello_world() << std::endl;
}
ほとんどの現代リンカーは、最適化されたものを正しく取得しますが、そのような場合のSCAツールの警告は無視されます。 –
この質問に対する答えは、コンパイラが自動的にそのような重複排除を行うことができることを説明しています:http://stackoverflow.com/questions/11399682/c-optimisation-of-string-literals – Leon
@Leon:重複しません。テキストリテラルは単一のファイルではありません。問題にはスコープも含まれています。 –