quarta-feira, janeiro 06, 2010

A ordem dos tratores altera o viaduto

Ontem eu tive alguns problemas ao tentar utilizar o framework de testes do Google (versão 1.4.0).

Eu recebia várias mensagens de erro do Visual Studio 2005 (que tu podes ver abaixo:

Error    1    error C2766: explicit specialization; 'std::numeric_limits' has already been defined    c:\arquivos de programas\microsoft visual studio 8\vc\include\limits    482    
Error    2    error C2766: explicit specialization; 'std::iterator_traits' has already been defined    c:\arquivos de programas\microsoft visual studio 8\vc\include\xutility    678    
Error    3    error C2766: explicit specialization; 'std::_Ptr_cat_helper' has already been defined    c:\arquivos de programas\microsoft visual studio 8\vc\include\xutility    1143    
Error    4    error C2766: explicit specialization; 'std::_Ptr_cat_helper' has already been defined    c:\arquivos de programas\microsoft visual studio 8\vc\include\xutility    1149    

Para encurtar a história, a ordem dos includes fez toda a diferença. Eu coloquei a linha
#include <gtest/gtest.h>

antes de todos os outros includes e os meus problemas desapareceram.

10 comentários:

wmoecke disse...

Nossa... e como encurtou a história.

Bom, apesar de nao ter entendido muito bem o q exatamente faz essa biblioteca do Google (Google Test) e consequentemente, como foi q ela fez a diferença nesse seu caso, poderia sugerir, partindo do pressuposto que você não tivesse esta biblioteca, que incluísse em seus fontes a diretiva condicional #ifndef, da seguinte forma:

#ifndef MEU_HEADER_H
#define MEU_HEADER_H
#endif

Isso impede que em multiplos includes ocorram multiplas definições de preprocessamento.


[]s,
Werner Moecke

Marcio Andrey Oliveira disse...

Werner, tudo bem?

Sintético ao extremo. ;)

Eu sempre uso os #ifndef em todos os meus códigos.

A princípio pensei que o problema fosse em algum dos 40 arquivos de header incluídos.

Talvez algum deles não usasse os #ifndef para prevenir inclusões multiplas.

Verifiquei um por um os arquivos de header bem como os #includes que eles usavam e todos estavam ok.

Talvez tu tenhas razão e algum dos arquivos não faça uso dos #ifndef e eu não tenha visto.

Porém, como não achei nada, depois de checar uns 100 headers, mais ou menos, resolvi inverter a posição do <gtest/gtest.h>.

Quem sabe uma hora dessas, depois que eu entregar o projeto, eu tenha tempo para rever tudo novamente.

Abraços.

wmoecke disse...

Nossa, e como eu entendo você, Márcio!

Sei bem como são esses misteriosos bugs de compilação chatos que aparecem na hora que a gente mais quer se ver livre do projeto...

Sempre queremos fazer a coisa do jeito certo, parar pra dar uma "escovada" no código, mas tem horas (quase sempre), em q o único jeito de resolver o problema é pensar "lateralmente" (ou, tentar as mais alucinantes e ilógicas alternativas para ver se resolve... rss)

*Poxa, você nao quis publicar o meu comentario sobre a DCE e o Beda Marques, la no seu outro artigo...? Deu um trabalhão escreve-lo... sniff.

;-)

Marcio Andrey Oliveira disse...

Opa.

Já respondi àquele comentário. :)

Podes continuar a participar com teus comentários que agora acho que não vão mais ficar no limbo esperando a moderação.

[]s.

wmoecke disse...

Hummm, pensando um pouco...
Acabei dando uma espiada nos fontes dessa lib, e pelo visto o chinezinho q a escreveu teve o cuidado de colocar um #ifndef no código dele. Mas olhando um pouco mais embaixo, existem outros includes - será que lá não tem alguma coisa sendo definida sem o teste condicional?
Explicaria perfeitamente o motivo de você ter limpado o erro de compilação apenas movendo o include do arquivo para o topo - Veja a lista dos includes:

#include
#include
#include
#include
#include
#include
#include
#include
#include

Marcio Andrey Oliveira disse...

Werner, tu não podes usar os símbolos "<" e ">" diretamente.

Tens que inserir os códigos html que os representam:

& (o e comercial) lt ; (tudo junto) = <
& o e comercial gt ; (tudo junto) = >

wmoecke disse...

Pois é, Márcio, aprendi mais uma dos blogues...

Mas se vc clicar no link ele te joga lá no fonte dessa lib - vc pode ver todos os includes q o chinês colocou lá. ;-)

Marcio Andrey Oliveira disse...

Eu acho que é algo nos meus fontes.

Depois que eu conseguir entregar o projeto eu vou checar para ver se descubro se o problema realmente é meu ou não.

wmoecke disse...

"Eu acho que é algo nos meus fontes."

Que é isso, companheiro! Programador C++ nunca erra - os outros é que erram...

O problema é com o chinês... ;-)

Marcio Andrey Oliveira disse...

Kaban, obrigado pela visita.

Eu não tenho nenhuma versão mais atualizada da planilha.

Tu podes alterá-la por conta própria se quiseres. Ela não está protegida justamente para permitir que cada um a modifique como desejar.

Para isso, tens que saber como a corretora que queres incluir cobra pelos serviços (além de saber como trabalhar com as planilhas do excel).

Se tu clicares sobre qualquer célula, verás as fórmulas usadas para cada trecho dos cálculos.

É só fazeres algo semelhante usando as informações da tua corretora.

Depois que incluíres uma corretora nova, por favor, envie-me uma cópia para eu publicar aqui.

[]s