Компилятору не нужно выделять одно и то же ограничение символа в одной и той же памяти. Если у вас есть ограничение char в двух файлах cpp, адрес будет другим.
Одна из идей - изменить карту на std :: map или объявить с помощью специального сравнения:
class CompareCString
{
bool operator()(const char* one,const char* two) { return strcmp(one,two)>0; };
};
typedef std::map<const char*, TInfo*, CompareCString> TInfoMap;
Этот компаратор намного медленнее, чем просто сравнение двух указателей. Вы можете сохранить указатель в статическом ограничении.
#define DEFINE_NAME(X) const char * X = #X ;
DEFINE_NAME(NAME1)
DEFINE_NAME(NAME2)
TInfo TInfoArray[] =
{
{NAME1,{""}, {""}},
{NAME2,{""}, {""}},
};
Использование:
map1->find(NAME1); // it should work.
Вы также можете создать массив const char * и изменить указатель cstring на указатель на идентичную cstring, найденную в этом массиве. Использование set - хорошая идея:
typedef set<const char *,CompareCString> IternStringSet;
const char* iternStringSetData[] =
{
"Name1","Name2","Name3","Name4"
};
enum IternStringNames
{
Name1,Name2,Name3,Name4
};
IternStringSet iternStringSet(iternStringSetData,iternStringSetData+4);
const char* intern(const char* name)
{
IternStringSet::iterator i = iternStringSet.find(name);
return ( i=!iternStringSet.end() ) ? *i : NULL;
}
const char* intern(IternStringNames name)
{
return iternStringSetData[name];
}
Использование:
const char* what = intern("Name1"); slower ,using strcmp, but done once
map1->find( what ); // faster, not using strcmp
map1->find( intern(Name1) ); // faster, not using strcmp