コンパイラの警告 (レベル 1) C4503
'identifier': 装飾された名前の長さが制限を超えました。名前は切り捨てられます
解説
このコンパイラの警告は互換性のために残されていますが、Visual Studio 2017 以降のコンパイラでは生成されません。
装飾名がコンパイラの制限 (4096) を超えており、切り捨てられました。 この警告と切り捨てを回避するには、引数の数を減らすか、使用する識別子の名前の長さを短くします。 コンパイラの制限を超える装飾名は、ハッシュが適用され、名前の競合の危険性がありません。
以前のバージョンの Visual Studio を使用する場合、テンプレートに特化したテンプレートがコードに含まれていると、この警告が発行される可能性があります。 たとえば、(C++ 標準ライブラリの) マップのマップなどです。 このような状況では、マップを含む typedef を型 (たとえば、 struct
) にすることができます。
ただし、コードを再構築しないことを決定する場合もあります。 C4503 を生成するアプリケーションを配布することはできますが、切り捨てられたシンボルでリンク時エラーが発生すると、エラーのシンボルの種類を特定するのが困難になることがあります。 また、デバッガーでシンボル名と型名を対応させるのが難しい場合があります。 ただし、プログラムの正確性は、切り捨てられた名前の影響を受けません。
例
次の例では、Visual Studio 2017 以前のコンパイラで C4503 が生成されます:
// C4503.cpp
// compile with: /W1 /EHsc /c
// C4503 expected
#include <string>
#include <map>
class Field{};
typedef std::map<std::string, Field> Screen;
typedef std::map<std::string, Screen> WebApp;
typedef std::map<std::string, WebApp> WebAppTest;
typedef std::map<std::string, WebAppTest> Hello;
Hello MyWAT;
このサンプルでは、C4503 を解決するためにコードを書き換える方法の 1 つを示します:
// C4503b.cpp
// compile with: /W1 /EHsc /c
#include <string>
#include <map>
class Field{};
struct Screen2 {
std::map<std::string, Field> Element;
};
struct WebApp2 {
std::map<std::string, Screen2> Element;
};
struct WebAppTest2 {
std::map<std::string, WebApp2> Element;
};
struct Hello2 {
std::map<std::string, WebAppTest2> Element;
};
Hello2 MyWAT2;