Manipulação TCHARs em arquivos de cabeçalho para bibliotecas com diferentes conjuntos de caracteres

StackOverflow https://stackoverflow.com/questions/813898

  •  03-07-2019
  •  | 
  •  

Pergunta

Eu tenho um projeto que usa duas bibliotecas de terceiros, os quais fazem uso de TCHARs em seus arquivos de cabeçalho. Infelizmente uma biblioteca é cumprido como multi-byte (chamemos-lhe biblioteca a), eo outro é compilado como Unicode (chamemos-lhe biblioteca b).

Agora, a maneira que eu entendo é que TCHAR é substituído pelo pré-compilador com qualquer wchar ou caractere, dependendo das opções de compilação. Assim, quando uma biblioteca foi compilada qualquer método que leva um parâmetro do tipo TCHAR foi definido para esperar um parâmetro do tipo char, e métodos na biblioteca b estão definidos para esperar um parâmetro do tipo wchar.

Infelizmente o meu aplicativo de consumo tem que escolher um conjunto de caracteres também. Se eu pegar Unicode, em seguida, o arquivo de cabeçalho eu incluí para a biblioteca um me diz que o método quer um wchar, porque quando eu compilar os TCHARs no cabeçalho eles são interpretados como wchars. Isto inclui TCHARs definida dentro das estruturas. I confirmaram esse comportamento na prática, quando eu alocar e passar tampão um TCHAR eu recebo lixo de volta, porque ele enche minha tampão wchar com dados multi-byte.

As minhas perguntas são: Existe uma maneira limpa para consumir essas duas bibliotecas na mesma aplicação? Estou talvez fazendo algo de errado com a forma como eu estou usando essas bibliotecas?

Foi útil?

Solução

Assumindo que você não está usando muitos de classe / função em qualquer uma destas bibliotecas, eu embrulhar uma das biblioteca completamente. Vamos dizer que se você decidiu usar mbc em seu aplicativo e enrole b biblioteca (unicode), o seu arquivo de cabeçalho invólucro pode usar wchar_t vez de TCHAR tão #define não irá afectar a sua interface. Dentro arquivo CPP do seu invólucro onde #include cabeçalhos biblioteca de b, você #define TCHAR para corresponder biblioteca b. Nenhum código diferente do seu invólucro deve ser autorizado a ver biblioteca b.

Se você estiver usando mais de uma classe / função de poucos em ambas as bibliotecas, mantendo o código wrapper rapidamente tornar-se um problema próprio.

Outras dicas

Como Shing Yip sugeriu, melhor envolver a diferença em uma API de seu próprio país. Isso faz com que o seu independente código fonte do mesmo.

A API de embrulho, então tem de converter os caracteres de sua codificação da biblioteca. No Windows, eu ter funções chamado WideCharToMultiByte e similares.

Eu acho que sua melhor opção é optar por uma biblioteca ou b biblioteca (vamos dizer uma biblioteca para este exemplo) maneira de fazê-lo. E então quando você incluir arquivos b cabeçalho da biblioteca, certifique-se de # definir / # undef qualquer que seja b biblioteca foi compilado com. Então você tem que ter certeza que você converter entre uma biblioteca e uma biblioteca b qualquer momento eles usam os mesmos dados.

Seria realmente melhor se você pudesse levá-los compilado da mesma maneira. Caso contrário, ele vai ser muito confuso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top