Mostrando postagens com marcador c. Mostrar todas as postagens
Mostrando postagens com marcador c. Mostrar todas as postagens

quarta-feira, janeiro 06, 2010

The order of the include files make a difference.

Yesterday I was facing some problems to use Google C++ Testing Framework (version 1.4.0).

I got a bunch of error messages from Visual Studio 2005 that you can see below.

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    

To make a long story short: the order of the include files made a difference. I put line
#include <gtest/gtest.h>
before all other include files and my problems vanished!

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.

terça-feira, junho 23, 2009

Do you really know C

I don't like to write about C because Wanderley, a friend of mine, is much more able to talk about it, but I think I must report what happened to me these days.

After some time developing with a programming language we get so used to it that we start thinking we are the master on it.

But usually the opposite happens: we forget some basic and subtle aspects of the language.

A couple of days ago I wrote the C command bellow:
printf("x position = %d (again??)", 7);
and to my surprise it was printed
x position = 7 (again ]
Why didn't the application printed
x position = 7 (again ??)
I thought "Visual Studio (2005) is a crap!".

Some taboo words latter and I realized what the problem was.

I remembered C has a feature named trigraph. In other words, C replaces all special sequences of three characters by their single-character equivalent.

The following are the nine trigraph sequences that C recognizes.
Trigraph    Equivalent
??=         #
??/         \
??'         ^
??(         [
??)         ]
??!         |
??<         {
??>         }
??-         ~
Why do C has trigraphs? To let us for writing source code when the keyboard being used does not support any of these nine characters.

I compiled the program using gcc and it gives me the following warning
warning: trigraph ??) ignored, use -trigraphs to enable
This means that on gcc we must explicitly request to it to enable trigraphs. The output presented after running the program was
x position = 7 (again ??)
Since 1994 the C standard (C99), supplies digraphs as more readable alternatives to six of the trigraphs. They are:
Digraph     Equivalent
<:      [
:>      ]
<%      {
%>      }
%:      #
%:%:    ##
I must not be so proud of myself because eventually something (like this) remembers me that I am already a newbie and a wanna-be.

Oh, and at this time Visual Studio was unfairly blamed. Sorry ;)

Você conhece mesmo o C

Eu não gosto de escrever sobre C, porque o meu amigo Wanderley é muito mais abilitado para falar sobre o assunto (além de escrever de um modo bem divertido), mas eu acho que eu devo falar sobre o que aconteceu comigo estes dias.

Após algum tempo desenvolvendo com uma linguagem de programação nós nos acostumamos a ela e começamos a achar que a dominamos.

Mas, geralmente, o que ocorre é o contrário: nós esquecemos alguns aspectos mais básicos e sutis da linguagem.

Alguns dias atrás eu escrevi o seguinte trecho de código em C:
printf("x position = %d (again??)", 7);
e, para minha surpresa, foi impresso
x position = 7 (again ]
Por que o programa não imprimiu
x position = 7 (again ??)
Eu pensei "esse Visual Studio é uma merda!". Alguns palavrões depois e eu percebi qual era o problema.

Eu lembrei que o C tem um recurso chamado trígrafo. Em outras palavras, o C substitui todas as ocorrências de sequências especiais de três caracteres por seus equivalentes de caracter único.

A seguir temos as nove sequências de trígrafos que o C reconhece.
Trigraph     Equivalent
??=          #
??/          \
??'          ^
??(          [
??)          ]
??!          |
??<          {
??>          }
??-          ~
E por que o C suporta trígrafos? Para nos permitir escrever códigos fonte quando o teclado que estiver sendo usado não possuir suporte aos nove caracteres acima.

Eu compilei o programa usando o gcc e obtive o seguinte warning
warning: trigraph ??) ignored, use -trigraphs to enable
Ou seja, eu devo explicitamente habilitar o uso de trígrafos no gcc. A saída do programa após executá-lo foi
x position = 7 (again ??)
Desde 1994 o padrão do C (C99) fornece suporte a dígrafos como uma alternativa mais legível a seis dos nove trígrafos. São eles:
Digraph  Equivalent
<:                    [
:>                    ]
<%                  {
%>                  }
%:                   #
%:%:              ##
Eu não devo me sentir tão orgulhoso de mim, porque sempre termina acontecendo algo desse tipo para me lembrar que eu ainda tenho muito para aprender.

Ah, e dessa vez o Visual Studio foi xingado injustamente. Desculpem-me ;)

quinta-feira, maio 21, 2009

How to declare 64 bits in Visual Studio 6

Did you ever needed to declare a 64 bits integer using Visual Studio 6?

On newer versions of Visual Studio and on gcc you can use the ll to tell the compiler that the value is 64 bits wide. But Visual Studio 6 does not understand it.

How do you do? You must use the keyword
__int64.

I discovered it because a project I wrote using Visual Studio 2005 that must be compiled using Visual Studio 6.

Below you can see a sample code that compiles both in VS 6 and 2005.

#include
#include "stdafx.h"
#include

int main(int argc, char* argv[])
{
__int64 i = 0;

printf("Hello World! %08x %08x\n", i);

#ifdef _MSC_VER
#if _MSC_VER <= 1200
// Visual Studio 6 or lower do not accept ll as 64 bits constants.
#define __IGNORE_LL_MODIFIER_MS
#endif // _MSC_VER
#endif // _MSC_VER

#ifdef __IGNORE_LL_MODIFIER_MS
i = ((__int64)0x1234567890123456);
#else
i = 0x1234567890123456ll;
#endif

printf("Hello World! %08x %08x\n", i);
getchar();
return 0;
}
I really hope this piece of information will be helpful to someone.