<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="wordpress/2.2" -->
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	>

<channel>
	<title>Caloni.com.br &#187; C++</title>
	<link>http://www.caloni.com.br/blog</link>
	<description>C++, Windows, Programação, Depuração e Transpiração</description>
	<pubDate>Tue, 31 Aug 2010 01:17:08 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.2</generator>
	<language>en</language>
			<item>
		<title>Evento C++</title>
		<link>http://www.caloni.com.br/blog/archives/evento-c</link>
		<comments>http://www.caloni.com.br/blog/archives/evento-c#comments</comments>
		<pubDate>Mon, 16 Aug 2010 16:36:58 +0000</pubDate>
		<dc:creator>Wanderley Caloni</dc:creator>
		
		<category><![CDATA[Depuração]]></category>

		<category><![CDATA[C++]]></category>

		<guid isPermaLink="false">http://www.caloni.com.br/blog/archives/evento-c</guid>
		<description><![CDATA[Esse fim-de-semana houve o tão falado evento C++, com a presença de dezenas de pessoas, algo que eu sinceramente não esperava. O bom desse evento foi saber que existem tantas pessoas interessadas em manter contato com quem gosta e pratica essa linguagem e também em saber que o nível técnico das palestras estão de alto [...]]]></description>
			<content:encoded><![CDATA[<p>Esse fim-de-semana houve o tão falado evento C++, com a presença de dezenas de pessoas, algo que eu sinceramente não esperava. O bom desse evento foi saber que existem tantas pessoas interessadas em manter contato com quem gosta e pratica essa linguagem e também em saber que o nível técnico das palestras estão de alto para avançado.</p>
<p>Infelizmente em nenhuma das duas palestras práticas (minha e do Fernando) houve participação interativa, e ninguém que eu saiba abriu meu pacote-surpresa com os dumps a serem analisados. De qualquer forma, minha palestra ficou bagunçada pelo excesso de conteúdo e falta de tempo, o que me fez dar boas risadas ao ouvir no twitter que <a href="http://twitter.com/nicolasgavlak/status/21201995301" title="Twitter">minha palestra foi mais um brainstorm</a>. A intenção não era essa, claro, mas meu claro despreparo para muito conteúdo gerou essa impressão. Espero que do pouco que consegui explicar alguém tenha achado utilidade.</p>
<p>E, pelo jeito, futuramente irei aplicar essa mesma metodologia brainstorm em um videocast, que ainda não decidi como irei preparar. A ideia é analisarmos alguns dumps em conjunto e, para os que acompanharem online, a interatividade de perguntas &amp; respostas.</p>
<p>Mas enquanto isso não acontece vamos dar uma olhada no que tínhamos no <a href="http://www.caloni.com.br/blog/archives/nao-e-minha-culpa">pacote-surpresa</a>.</p>
<h4>1. NotMyFaultEither.exe.mdmp - Stack Trash</h4>
<pre>0:000&gt; kv
ChildEBP RetAddr  Args to Child
0012b200 7c90df3c 7c8025db 000000e8 00000000 ntdll!KiFastSystemCallRet
0012b204 7c8025db 000000e8 00000000 0012b238 ntdll!NtWaitForSingleObject+0xc
0012b268 7c802542 000000e8 000493e0 00000000 kernel32!WaitForSingleObjectEx+0xa8
0012b27c 6998ada6 000000e8 000493e0 003a0043 kernel32!WaitForSingleObject+0x12
0012bd70 6998aff1 000000c4 00000568 000000d0 faultrep!InternalGenerateMinidumpEx+0x335
0012bd9c 6998b50a 000000c4 00000568 0012c698 faultrep!InternalGenerateMinidump+0x75
0012c678 69986652 000000c4 00000568 0012c698 faultrep!InternalGenFullAndTriageMinidumps+0x8a
0012dea0 69987d3d 0012df18 0015c300 00000000 faultrep!ReportFaultDWM+0x4e5
0012e398 699882d8 0040a1dc 0012f1e0 ffffffff faultrep!StartManifestReportImmediate+0x268
0012f404 7c8643c6 0040a1dc ffffffff 0012fc24 faultrep!ReportFault+0x55a
Unable to load image C:\Documents and Settings\Administrador\Desktop\NotMyFaultEither.exe
*** WARNING: Unable to verify timestamp for NotMyFaultEither.exe
*** ERROR: Module load completed but symbols could not be loaded for NotMyFaultEither.exe
0012f678 004018aa 0040a1dc e280eec4 1d7f113b kernel32!UnhandledExceptionFilter+0x55b
WARNING: Stack unwind information not available. Following frames may be wrong.
0012f9ac 00401357 <font color="#ff0000">dededede dededede dededede</font> NotMyFaultEither+0x18aa
0012fbe8 <font color="#ff0000">dededede dededede dededede dededede</font> NotMyFaultEither+0x1357
0012fbec <font color="#ff0000">dededede dededede dededede dededede</font> 0xdededede
0012fbf4 <font color="#ff0000">dededede dededede dededede dededede</font> 0xdededede
...</pre>
<p>Como foi visto na palestra, uma pilha nesse estado demonstra claramente alguma variável que estourou e corrompeu o resto da pilha de chamadas. Na hora de voltar para a função chamadora, o endereço usado foi o endereço reescrito por lixo, e daí temos o "crash-pattern" Stack Trash.</p>
<h4>2. NotMyFaultEither.mdmp - Dead Lock</h4>
<pre>0:000&gt; kv
ChildEBP RetAddr  Args to Child
0012f900 7c90df3c 7c8025db 0000007c 00000000 ntdll!KiFastSystemCallRet
0012f904 7c8025db <font color="#ff0000">0000007c </font>00000000 00000000 ntdll!NtWaitForSingleObject+0xc
0012f968 7c802542 0000007c ffffffff 00000000 kernel32!WaitForSingleObjectEx+0xa8
0012f97c 00401176 0000007c ffffffff 00000111 kernel32!WaitForSingleObject+0x12
WARNING: Stack unwind information not available. Following frames may be wrong.
0012f9c0 7c910202 00000002 001506e8 00150000 NotMyFaultEither+0x1176
0012f9f8 7e3746d3 01010050 00000000 00000000 ntdll!RtlpAllocateFromHeapLookaside+0x42
0012fa5c 7e382672 01010050 01100068 7e3a4716 user32!DrawStateW+0x5cd
0012fae8 7e382c75 001563ac 01010050 00000003 user32!xxxBNDrawText+0x313
0012fb20 002d0036 00000000 00000020 0012fb3c user32!xxxDrawButton+0xbb
0012fb30 7e3799d8 0000800a 0012fbc8 7e375ba2 0x2d0036
0012fb3c 7e375ba2 0000800a 002d0036 fffffffc user32!NotifyWinEvent+0xd
0012fbc8 00000000 002d0036 004011b0 dcbaabcd user32!ButtonWndProcWorker+0x79b
0:000&gt; !handle 0000007c
Handle <font color="#ff0000">0000007c</font>
  Type         	<font color="#ff0000">Thread</font>
0:000&gt; ~* kv

.  0  Id: 5e4.<font color="#008000">39c </font>Suspend: 0 Teb: 7ffdd000 Unfrozen
ChildEBP RetAddr  Args to Child
0012f900 7c90df3c 7c8025db 0000007c 00000000 ntdll!KiFastSystemCallRet
0012f904 7c8025db 0000007c 00000000 00000000 ntdll!NtWaitForSingleObject+0xc
0012f968 7c802542 0000007c ffffffff 00000000 kernel32!WaitForSingleObjectEx+0xa8
0012f97c 00401176 0000007c ffffffff 00000111 kernel32!WaitForSingleObject+0x12
WARNING: Stack unwind information not available. Following frames may be wrong.
0012f9c0 7c910202 00000002 001506e8 00150000 NotMyFaultEither+0x1176
0012f9f8 7e3746d3 01010050 00000000 00000000 ntdll!RtlpAllocateFromHeapLookaside+0x42
0012fa5c 7e382672 01010050 01100068 7e3a4716 user32!DrawStateW+0x5cd
0012fae8 7e382c75 001563ac 01010050 00000003 user32!xxxBNDrawText+0x313
0012fb20 002d0036 00000000 00000020 0012fb3c user32!xxxDrawButton+0xbb
0012fb30 7e3799d8 0000800a 0012fbc8 7e375ba2 0x2d0036
0012fb3c 7e375ba2 0000800a 002d0036 fffffffc user32!NotifyWinEvent+0xd
0012fbc8 00000000 002d0036 004011b0 dcbaabcd user32!ButtonWndProcWorker+0x79b

   1  Id: 5e4.6a4 Suspend: 0 Teb: 7ffdc000 Unfrozen
ChildEBP RetAddr  Args to Child
00b8ff10 7c90df3c 7c91b22b 00000080 00000000 ntdll!KiFastSystemCallRet
00b8ff14 7c91b22b 00000080 00000000 00000000 ntdll!NtWaitForSingleObject+0xc
00b8ff9c 7c901046 0040e940 004010e0 0040e940 ntdll!RtlpWaitForCriticalSection+0x132
00b8ffa4 004010e0 <font color="#0000ff">0040e940 </font>00000000 00000000 ntdll!RtlEnterCriticalSection+0x46
WARNING: Stack unwind information not available. Following frames may be wrong.
00b8ffec 00000000 004010c0 0012f99c 00000000 NotMyFaultEither+0x10e0
0:000&gt; !cs <font color="#0000ff">0040e940</font>
-----------------------------------------
Critical section   = 0x0040e940 (NotMyFaultEither+0xE940)
DebugInfo          = 0x00154498
<font color="#0000ff">LOCKED</font>
LockCount          = 0x1
OwningThread       = <font color="#008000">0x0000039c</font>
RecursionCount     = 0x1
LockSemaphore      = 0x80
SpinCount          = 0x00000000</pre>
<p>A thread ativa no momento do dump aguardava por outra thread. Listando todas as threads do processo temos a primeira e a segunda, que tenta entrar em um critical section. Quando vemos que aquele CS estava sendo bloqueado pela primeira thread vemos claramente se tratar de um dead lock.</p>
<h4>3. NotMyFaultEither_100808_172407.dmp - Access Violation</h4>
<pre>0:000&gt; kv
ChildEBP RetAddr  Args to Child
WARNING: Stack unwind information not available. Following frames may be wrong.
0012f9cc 7e37f916 01010052 005a0049 0012f9f4 NotMyFaultEither+0x10a3
0012fa58 7e37f991 01010052 00000043 01100076 user32!ClientFrame+0xe0
0012fa7c 7e382909 01010052 0012fa98 00000000 user32!DrawFocusRect+0x40
0012fae8 7e382c75 00156304 01010052 00000003 user32!xxxBNDrawText+0x3e9
0012fb20 001100a0 00000000 00000020 0012fb3c user32!xxxDrawButton+0xbb
0012fb30 7e3799d8 0000800a 0012fbc8 7e375ba2 0x1100a0
0012fb3c 7e375ba2 0000800a 001100a0 fffffffc user32!NotifyWinEvent+0xd
0012fbc8 00000000 001100a0 004010f0 dcbaabcd user32!ButtonWndProcWorker+0x79b
0:000&gt; <font color="#ff0000">? eax+edx</font>
Evaluate expression: 0 = <font color="#ff0000">00000000</font>
0:000&gt; u
NotMyFaultEither+0x10a3:
004010a3 66890c02        mov     word ptr [<font color="#ff0000">edx+eax</font>],cx
004010a7 83c002          add     eax,2
004010aa 6685c9          test    cx,cx</pre>
<p>O disassemble da instrução inválida tenta escrever claramente em cima do endereço zerado (edx + eax). Dessa forma fica fácil saber que esse tipo de escrita não é permitido, constituindo nosso famosíssimo AV.</p>
<h4>4. NotMyFaultEither_100808_175404.dmp - Exception not Handled</h4>
<pre>eax=00000000 ebx=00000111 ecx=7c91003d edx=00010000 esi=00330120 edi=7e374dfa
eip=7c90120e esp=0012f9a0 ebp=00000001 iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000246
ntdll!DbgBreakPoint:
<font color="#ff0000">7c90120e cc              int     3</font>
0:000&gt; kv
ChildEBP RetAddr  Args to Child
0012f99c 004011ec 0012fc24 004010d0 0012fbe8 <font color="#ff0000">ntdll!DbgBreakPoint</font> (FPO: [0,0,0])
WARNING: Stack unwind information not available. Following frames may be wrong.
0012f9cc 7e37f916 01010054 005a0049 0012f9f4 NotMyFaultEither+0x11ec
0012fa58 7e37f991 01010054 00000043 01100076 user32!ClientFrame+0xe0</pre>
<p>Esse foi meio de brinde. Uma exceção de breakpoint (int 3, ntdll!DbgBreakPoint) lançada sem um depurador atachado implica em derrubamento do processo, pois é uma exceção como outra qualquer. O programador deve ter esquecido um DebugBreak ou algo que o valha no código de produção, que acabou sendo executado.</p>
<h5>5. ntdll_cliente.dll - Importação de símbolos</h5>
<p><a href="http://www.caloni.com.br/blog/wp-content/uploads/vm-sony-xp-2010-08-08-17-59-22.png" title="vm-sony-xp-2010-08-08-17-59-22.png"><img src="http://www.caloni.com.br/blog/wp-content/uploads/vm-sony-xp-2010-08-08-17-59-22.png" alt="vm-sony-xp-2010-08-08-17-59-22.png" /></a><br />
Essa foi a DLL encontrada no cliente quando ocorreu o problema relatado na imagem, também em anexo. Isso foi demonstrado na palestra com a ajuda do meu script que carrega DLLs, além de um pouco de sorte. Podemos analisar esse caso com mais calma em outro artigo. Acho que já falei demais por aqui.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.caloni.com.br/blog/archives/evento-c/feed</wfw:commentRss>
		</item>
		<item>
		<title>Sétimo Encontro de Programadores C++</title>
		<link>http://www.caloni.com.br/blog/archives/setimo-encontro-de-programadores-c</link>
		<comments>http://www.caloni.com.br/blog/archives/setimo-encontro-de-programadores-c#comments</comments>
		<pubDate>Mon, 26 Jul 2010 02:44:31 +0000</pubDate>
		<dc:creator>Wanderley Caloni</dc:creator>
		
		<category><![CDATA[Devaneando]]></category>

		<category><![CDATA[Depuração]]></category>

		<category><![CDATA[C++]]></category>

		<guid isPermaLink="false">http://www.caloni.com.br/blog/archives/setimo-encontro-de-programadores-c</guid>
		<description><![CDATA[Mais um fim-de-semana no ócio e na vadiagem. Tenho que manter minhas qualidades de bom programador que sou: preguiçoso, impaciente e pretensioso.
Mas nem por isso deixei de terminar uma primeira versão do aplicativo que irei usar como base na minha palestra do nosso próximo encontro C++: Crash Dump Analysis. Se alguém tiver dicas de quais [...]]]></description>
			<content:encoded><![CDATA[<p>Mais um fim-de-semana no ócio e na vadiagem. Tenho que manter minhas <a href="http://c2.com/cgi/wiki?LazinessImpatienceHubris">qualidades de bom programador</a> que sou: preguiçoso, impaciente e pretensioso.</p>
<p>Mas nem por isso deixei de terminar uma primeira versão do aplicativo que irei usar como base na minha palestra do nosso próximo <a href="http://www.ccppbrasil.org/wiki/Grupo:Encontro_VII">encontro C++</a>: <a href="http://www.caloni.com.br/blog/wp-content/uploads/crashdumpanalysis.7z" title="CrashDumpAnalysis">Crash Dump Analysis</a>. Se alguém tiver dicas de quais os problemas mais difíceis do Universo para analisar em um dump de memória, comente a respeito e veremos o que dá pra fazer.</p>
<p style="text-align: center"><img src="http://www.caloni.com.br/blog/wp-content/uploads/crash-dump.png" alt="crash-dump.png" /></p>
<p>Enquanto isso, continuo descobrindo maravilhas do WinDbg. Essa semana fiquei brincando de colocar breakpoint em user-mode, mas depurando o kernel, como fizeram <a href="http://blogs.msdn.com/b/ntdebugging/archive/2010/07/20/debugging-services-startup-in-svchost-from-a-kernel-mode-debug-session.aspx">os rapazes do Ntdebugging</a>. A conclusão é que ele vale para todos os aplicativos abertos. Tente com o MessageBox!</p>
<pre>!process 0 0 notepad.exe
.reload /user
bp user32!MessageBoxW</pre>
<p>Mas devaneio. Talvez outra boa qualidade de um bom programador.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.caloni.com.br/blog/archives/setimo-encontro-de-programadores-c/feed</wfw:commentRss>
		</item>
		<item>
		<title>Const e Volatile</title>
		<link>http://www.caloni.com.br/blog/archives/const-e-volatile</link>
		<comments>http://www.caloni.com.br/blog/archives/const-e-volatile#comments</comments>
		<pubDate>Fri, 04 Jun 2010 17:26:33 +0000</pubDate>
		<dc:creator>Wanderley Caloni</dc:creator>
		
		<category><![CDATA[C++]]></category>

		<guid isPermaLink="false">http://www.caloni.com.br/blog/archives/const-e-volatile</guid>
		<description><![CDATA[

Padrão C (ISO/IEC 9899:1990)

6.5.3 type-qualifier
 const
 volatile
Padrão C++ (ISO/IEC 14882:1998)

cv-qualifier
 const
 volatile
Qualificadores de tipo
Chamamos de qualificador de tipo as palavrinhas mágicas const e volatile. Na prática elas definem como uma determinada variável será usada e se comportará durante a vida do programa.
Const
Uma variável const não pode ser alterada pelo programa durante sua execução, apenas durante [...]]]></description>
			<content:encoded><![CDATA[

<pre>Padrão C (ISO/IEC 9899:1990)

6.5.3 type-qualifier
 const
 volatile</pre>
<pre>Padrão C++ (ISO/IEC 14882:1998)

cv-qualifier
 const
 volatile</pre>
<h4>Qualificadores de tipo</h4>
<p>Chamamos de qualificador de tipo as palavrinhas mágicas <strong>const </strong>e <strong>volatile</strong>. Na prática elas definem como uma determinada variável será usada e se comportará durante a vida do programa.</p>
<h4>Const</h4>
<p>Uma variável const não pode ser alterada pelo programa durante sua execução, apenas durante sua inicialização:</p>
<pre>const float pi = 3.14; // até onde sabemos, pi não irá mudar neste Universo</pre>
<p>No exemplo acima, o valor de pi não pode mais ser alterado. Só que repare que ele foi, em determinado momento, alterado com um valor constante: na sua inicialização. Isso quer dizer que:</p>
<ul>
<li>pi é uma variável no programa representada por um local na memória <strong>endereçável </strong>pelo programa</li>
<li>pi não é um define do pré-processador que irá virar uma constante literal (3.14, por exemplo)</li>
</ul>
<pre>// eu posso endereçar uma constante,
// desde que qualifique corretamente meu ponteiro
const float* ppi = &amp; pi;</pre>
<p align="center"><img src="http://www.caloni.com.br/blog/wp-content/uploads/const-memory.png" alt="const-memory.png" height="291" width="133" /></p>
<p>Teoricamente a região da memória que contiver uma variável const pode ser qualificada pelo sistema operacional como somente-leitura, mas isso não é uma obrigação. É obrigação do compilador avisar sobre tentativas de alteração da variável no meio do programa, mas nem sempre é possível enxergar que a memória não é alterável. Dessa forma, resultados imprevisíveis podem ocorrer.</p>
<p><img src="http://www.caloni.com.br/blog/wp-content/uploads/const-gpf.png" alt="const-gpf.png" height="506" width="545" /></p>
<h4>Uso prático</h4>
<p>Eu costumo usar variáveis const no lugar de defines. Além de ganhar na tipagem as constantes não precisam ser necessariamente globais, nem acessíveis por outros módulos. Um outro uso muito comum é criar variáveis locais que você sabe que não devem ser alteráveis por ninguém, como o tamanho de matrizes primitivas.</p>
<p><pre><span style="color: #0000ff;">namespace</span> Math
<span style="color: #000000; font-weight: bold;">&#123;</span>
	<span style="color: #0000ff;">const</span> <span style="color: #0000ff;">float</span> Pi = <span style="color: #000000;">3</span>.<span style="color: #000000;">14</span>;
<span style="color: #000000; font-weight: bold;">&#125;</span>
&nbsp;
<span style="color: #006600;">//...</span>
&nbsp;
<span style="color: #0000ff;">int</span> func1<span style="color: #000000; font-weight: bold;">&#40;</span><span style="color: #0000ff;">int</span> x<span style="color: #000000; font-weight: bold;">&#41;</span>
<span style="color: #000000; font-weight: bold;">&#123;</span>
	<span style="color: #0000ff;">float</span> calc = x * Math::<span style="color: #000000;">Pi</span>;
	<span style="color: #0000ff;">return</span> calc;
<span style="color: #000000; font-weight: bold;">&#125;</span>
&nbsp;
<span style="color: #006600;">//...</span>
&nbsp;
<span style="color: #0000ff;">int</span> func2<span style="color: #000000; font-weight: bold;">&#40;</span><span style="color: #0000ff;">int</span> y<span style="color: #000000; font-weight: bold;">&#41;</span>
<span style="color: #000000; font-weight: bold;">&#123;</span>
	<span style="color: #0000ff;">const</span> <span style="color: #0000ff;">size_t</span> PathSize = MAX_PATH * <span style="color: #000000;">2</span>;
	<span style="color: #006600;">//...</span>
	<span style="color: #006600;">//...</span>
	<span style="color: #0000ff;">char</span> path<span style="color: #000000; font-weight: bold;">&#91;</span>PathSize<span style="color: #000000; font-weight: bold;">&#93;</span>;
	<span style="color: #006600;">//...</span>
<span style="color: #000000; font-weight: bold;">&#125;</span></pre></p>
<h4>Volatile</h4>
<p>O significado do volatile teoricamente muda de implementação para implementação, mas na prática é uma forma de definir uma variável que está sendo acessada por outros programas/threads/entidades espíritas que podem alterar o seu valor sem seu programa notar quando.</p>
<p style="text-align: center"><img src="http://www.caloni.com.br/blog/wp-content/uploads/volatile-girl.jpg" title="Se concentre! Não é esse tipo de volatile!" alt="Se concentre! Não é esse tipo de volatile!" height="189" width="189" /></p>
<p>O exemplo clássico da API Win32 é o <a href="http://msdn.microsoft.com/en-us/library/ms683614%28VS.85%29.aspx">InterlockedIncrement</a>, que realiza operações atômicas em valores inteiros. Para fazer isso é necessário usar um recurso interno disponível pelo processador que irá modificar a memória sem intrusão de outras threads/processadores.</p>
<p><img src="http://www.caloni.com.br/blog/wp-content/uploads/interlocked-increment.png" alt="interlocked-increment.png" /></p>
<h4>Uso prático</h4>
<p>Variáveis volatile geralmente interagem de alguma forma com o sistema em que rodam, e são representadas por ponteiros para memória retornada por esse sistema ou documentada como sendo de uso específico.</p>
<h4>Const e Volatile</h4>
<p>É possível que exista uma variável que não pode ser modificada pelo seu programa, mas é modificada pelo sistema, de forma que ela é uma mutante!</p>
<pre>/// endereça o relógio do sistema, atualizado a cada 1/100 milissegundos
const volatile int* g_systemClock = (const volatile int*) 0x7689B9D4;</pre>
<p><a href="http://fotos-videos-incriveis.blogspot.com/2009/04/tubarao-mutante.html" title="mutante.jpg"></a></p>
<p style="text-align: center"><a href="http://fotos-videos-incriveis.blogspot.com/2009/04/tubarao-mutante.html" title="mutante.jpg"><img src="http://www.caloni.com.br/blog/wp-content/uploads/mutante.jpg" alt="mutante.jpg" height="102" width="129" /> </a></p>
<p>A definição de *g_systemClock é de uma memória que não pode ser alterada; só que ela é, pelo sistema. Então a variável também é volatile. No entanto, independente de ser const ou volatile, o tipo nunca será <strong>alterado</strong>, apenas <strong>qualificado</strong>. São duas coisas diferentes na linguagem.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.caloni.com.br/blog/archives/const-e-volatile/feed</wfw:commentRss>
		</item>
		<item>
		<title>Enum</title>
		<link>http://www.caloni.com.br/blog/archives/enum</link>
		<comments>http://www.caloni.com.br/blog/archives/enum#comments</comments>
		<pubDate>Mon, 31 May 2010 17:11:09 +0000</pubDate>
		<dc:creator>Wanderley Caloni</dc:creator>
		
		<category><![CDATA[C++]]></category>

		<guid isPermaLink="false">http://www.caloni.com.br/blog/archives/enum</guid>
		<description><![CDATA[











Padrão C (ISO/IEC 9899:1990)

6.5.2.2 enum-specifier
 enum

Padrão C++ (ISO/IEC 14882:1998)

type-specifier
 enum-specifier

enum-specifier
 enum
Uma enumeração faz duas coisas: define um novo tipo, parecido com um inteiro, e cria uma lista de constantes com nomes significativos. A definição técnica do tipo de um enum é mais complicada, mas basicamente ele é um novo int.
Como funciona: definimos uma lista com [...]]]></description>
			<content:encoded><![CDATA[











<pre>Padrão C (ISO/IEC 9899:1990)

6.5.2.2 enum-specifier
 <strong>enum</strong></pre>
<pre></pre>
<pre>Padrão C++ (ISO/IEC 14882:1998)

type-specifier
 enum-specifier

enum-specifier
 <strong>enum</strong></pre>
<p>Uma enumeração faz duas coisas: define um novo tipo, parecido com um inteiro, e cria uma <strong>lista de constantes com nomes significativos</strong>. A definição técnica do tipo de um enum é mais complicada, mas basicamente ele é um novo int.</p>
<p>Como funciona: definimos uma lista com cada elemento tendo um valor inteiro, geralmente único. Todos os nomes usados na lista passam a fazer parte do espaço de nomes atual e funcionam como constantes com o seu valor definido no início.</p>
<p><pre><span style="color: #0000ff;">enum</span> FileType <span style="color: #006600;">// criamos o novo tipo inteiro FileType</span>
<span style="color: #000000; font-weight: bold;">&#123;</span>
   Binary = <span style="color: #000000;">1</span>, <span style="color: #006600;">// Binary &eacute; uma constante com valor igual a 1</span>
   Text = <span style="color: #000000;">2</span>, <span style="color: #006600;">// Text &eacute; uma constante com seu sizeof igual a sizeof(FileType)</span>
   Mixed = <span style="color: #000000;">3</span> <span style="color: #006600;">// Todas as constantes da enumera&ccedil;&atilde;o s&atilde;o do mesmo tipo</span>
<span style="color: #000000; font-weight: bold;">&#125;</span>;</pre></p>
<p>Obs.: Os elementos que não possuem valor definido são definidos automaticamente como o valor do elemento anterior acrescidos de um. Se for o primeiro elemento, seu valor padrão é zero.</p>
<p><pre><span style="color: #0000ff;">enum</span> Numbers
<span style="color: #000000; font-weight: bold;">&#123;</span>
   zero,  <span style="color: #006600;">// igual a zero</span>
   one,   <span style="color: #006600;">// igual a um</span>
   two,   <span style="color: #006600;">// igual a dois</span>
   three  <span style="color: #006600;">// igual a tres</span>
<span style="color: #000000; font-weight: bold;">&#125;</span>;
&nbsp;
&nbsp;
<span style="color: #0000ff;">enum</span> Hexa
<span style="color: #000000; font-weight: bold;">&#123;</span>
   JulioCesar = <span style="color: #000000;">1</span>,
   Lucio = <span style="color: #000000;">3</span>,
   Juan,                <span style="color: #006600;">// Juan = 3 + 1 = 4</span>
   Gilberto Silva = <span style="color: #000000;">6</span>,
   Felipe Melo          <span style="color: #006600;">// 6 + 1 = 7</span>
<span style="color: #000000; font-weight: bold;">&#125;</span>;</pre><br />
<em>Detalhe bizarro</em>: você sabia que, apesar da vírgula ser usada para separar valores de enumeração, ela pode também terminar uma listagem? Por algum motivo exdrúxulo (se alguém quiser explicar), um valor de enumeração foi definido de tal forma que sempre poderá existir uma vírgula terminando ele:</p>
<p><pre><span style="color: #0000ff;">enum</span> VirgulaSafada <span style="color: #000000; font-weight: bold;">&#123;</span> 
   um = <span style="color: #000000;">1</span>, 
   dois, 
   tres, <span style="color: #006600;">// o que essa v&iacute;rgula no final t&aacute; fazendo aqui?</span>
<span style="color: #000000; font-weight: bold;">&#125;</span>;</pre></p>
<h4>Uso prático</h4>
<p>Geralmente usamos enumerações para definir valores únicos (tag) em um argumento de função, ou, mais moderno, como substituto daqueles antigos defines em C para mapas de bits. Nesse último caso não usamos o tipo da enumeração, pois ele pode conter apenas um valor único definido, e não um conjunto deles:</p>
<p><pre><span style="color: #0000ff;">enum</span> ModoDeServir
<span style="color: #000000; font-weight: bold;">&#123;</span>
   assado,
   cozido,
   frito,
   cru
<span style="color: #000000; font-weight: bold;">&#125;</span>;
&nbsp;
&nbsp;
<span style="color: #0000ff;">void</span> Cook<span style="color: #000000; font-weight: bold;">&#40;</span>Prato p, ModoDeServir ms<span style="color: #000000; font-weight: bold;">&#41;</span>;
&nbsp;
main<span style="color: #000000; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">&#41;</span>
<span style="color: #000000; font-weight: bold;">&#123;</span>
   Cook<span style="color: #000000; font-weight: bold;">&#40;</span>frango, cozido<span style="color: #000000; font-weight: bold;">&#41;</span>;
<span style="color: #000000; font-weight: bold;">&#125;</span>
&nbsp;
&nbsp;
<span style="color: #0000ff;">enum</span> FileOpenMode
<span style="color: #000000; font-weight: bold;">&#123;</span>
   fomRead   = 0x0001,
   fomWrite  = 0x0002,
   fomOver   = 0x0004,
   fomDel    = 0x0008,
<span style="color: #000000; font-weight: bold;">&#125;</span>;
&nbsp;
<span style="color: #0000ff;">void</span> OpenFile<span style="color: #000000; font-weight: bold;">&#40;</span>DWORD fileOpenMode<span style="color: #000000; font-weight: bold;">&#41;</span>;
&nbsp;
main<span style="color: #000000; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">&#41;</span>
<span style="color: #000000; font-weight: bold;">&#123;</span>
   OpenFile<span style="color: #000000; font-weight: bold;">&#40;</span>fomRead | fomWrite<span style="color: #000000; font-weight: bold;">&#41;</span>;
<span style="color: #000000; font-weight: bold;">&#125;</span></pre></p>
<p>Note que usamos uma enumeração nesse último caso para termos um nome significativo para uma flag, além desse nome fazer de fato parte dos nomes do programa, e não um define que, para o compilador, não existe.</p>
<h4>Boas práticas</h4>
<p>Como os tipos da enumeração passam a pertencer ao namespace atual, eles podem se misturar facilmente com todos os nomes daquele namespace. Dessa forma, é útil e bem organizado definir um prefixo para os nomes, que pode ser formado pelas iniciais do nome da enumeração, como no exemplo acima (fom = <strong>F</strong>ile<strong>O</strong>pen<strong>M</strong>ode).</p>
<p><img src="http://www.caloni.com.br/blog/wp-content/uploads/enum-namespace.png" alt="enum-namespace.png" /></p>
<p>O surgimento do enum veio como evolução de uma prática já consagrada pelo uso na linguagem C, que eram as listas de valores constantes criados através de defines com algum prefixo em comum (FILE_SHARE_*, SW_SHOW_*, etc). Portanto, sempre que se encontrar em uma situação para criar esse tipo de lista, a enumeração é o caminho atualmente ideal.</p>
<p><pre><span style="color: #006600;">// A listagem abaixo pode virar um enum...</span>
<span style="color: #006600;">#define FOM_READ   0x0001</span>
<span style="color: #006600;">#define FOM_WRITE  0x0002</span>
<span style="color: #006600;">#define FOM_OVER   0x0004</span>
<span style="color: #006600;">#define FOM_DEL    0x0008</span>
&nbsp;
<span style="color: #006600;">// ... como este aqui!</span>
<span style="color: #0000ff;">enum</span> FileOpenMode
<span style="color: #000000; font-weight: bold;">&#123;</span>
   FOM_READ   = 0x0001,
   FOM_WRITE  = 0x0002,
   FOM_OVER   = 0x0004,
   FOM_DEL    = 0x0008,
<span style="color: #000000; font-weight: bold;">&#125;</span>;
&nbsp;
&nbsp;
<span style="color: #006600;">// esse peda&ccedil;o de c&oacute;digo abaixo...</span>
<span style="color: #0000ff;">int</span> main<span style="color: #000000; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">&#41;</span>
<span style="color: #000000; font-weight: bold;">&#123;</span>
   OpenFile<span style="color: #000000; font-weight: bold;">&#40;</span>path, FOM_WRITE<span style="color: #000000; font-weight: bold;">&#41;</span>;
<span style="color: #000000; font-weight: bold;">&#125;</span>
&nbsp;
<span style="color: #006600;">// ... vira isso ap&oacute;s ser pr&eacute;-processado...</span>
<span style="color: #0000ff;">int</span> main<span style="color: #000000; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">&#41;</span>
<span style="color: #000000; font-weight: bold;">&#123;</span>
   OpenFile<span style="color: #000000; font-weight: bold;">&#40;</span>path, 0x0002<span style="color: #000000; font-weight: bold;">&#41;</span>;
<span style="color: #000000; font-weight: bold;">&#125;</span>
&nbsp;
<span style="color: #006600;">// ... mas isso se fossem usados enums...</span>
<span style="color: #0000ff;">int</span> main<span style="color: #000000; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">&#41;</span>
<span style="color: #000000; font-weight: bold;">&#123;</span>
   OpenFile<span style="color: #000000; font-weight: bold;">&#40;</span>path, FOM_WRITE<span style="color: #000000; font-weight: bold;">&#41;</span>; <span style="color: #006600;">// FOM_WRITE faz parte da linguagem</span>
<span style="color: #000000; font-weight: bold;">&#125;</span></pre></p>
<h4>Atualização: e qual a diferença?</h4>
<p>Perguntado <a href="http://www.caloni.com.br/blog/archives/enum#comment-17806">por um leitor</a> sobre qual a diferença prática do último exemplo, onde temos praticamente o mesmo resultado entre usar defines e enumerações, imaginei que a mesma dúvida pode ter surgido para várias pessoas, porque é uma boa dúvida. Dá a entender que o autor deste artigo está se atentando a preciosismos da linguagem (e está mesmo!), mas à vezes as aparências enganam.</p>
<p>Para ilustrar melhor fiz um mais elaborado. Aqui, estamos lendo pedaços de dados que tiveram que ser alinhados com alguma "gordura".</p>
<p><pre><span style="color: #006600;">// alinhamento obrigat&oacute;rio pelo leiaute dos dados</span>
<span style="color: #006600;">#define CHUNKSZ_BASE 0x5000</span>
&nbsp;
<span style="color: #006600;">#define CHUNKSZ_TINY   0x1000 + CHUNKSZ_BASE</span>
<span style="color: #006600;">#define CHUNKSZ_SMALL  0x2000 + CHUNKSZ_BASE</span>
<span style="color: #006600;">#define CHUNKSZ_MEDIUM 0x4000 + CHUNKSZ_BASE</span>
<span style="color: #006600;">#define CHUNKSZ_HUGE   0x8000 + CHUNKSZ_BASE</span>
&nbsp;
&nbsp;
<span style="color: #006600;">// alinhamento obrigat&oacute;rio pelo leiaute dos dados</span>
<span style="color: #0000ff;">static</span> <span style="color: #0000ff;">const</span> <span style="color: #0000ff;">int</span> chunkSizeBase = 0x5000;
&nbsp;
<span style="color: #0000ff;">enum</span> ChunkSize
<span style="color: #000000; font-weight: bold;">&#123;</span>
   chunkszTiny   = 0x1000 + chunkSizeBase,
   chunkszSmall  = 0x2000 + chunkSizeBase,
   chunkszMedium = 0x4000 + chunkSizeBase,
   chunkszHuge   = 0x8000 + chunkSizeBase,
<span style="color: #000000; font-weight: bold;">&#125;</span>;
&nbsp;
&nbsp;
<span style="color: #006600;">// Fonte original</span>
<span style="color: #0000ff;">int</span> main<span style="color: #000000; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">&#41;</span>
<span style="color: #000000; font-weight: bold;">&#123;</span>
	<span style="color: #006600;">// lendo quadro peda&ccedil;os de dados (tamanho m&eacute;dio)</span>
   ReadChunkFromFile<span style="color: #000000; font-weight: bold;">&#40;</span><span style="color: #0000ff;">file</span>, CHUNKSZ_MEDIUM * <span style="color: #000000;">4</span><span style="color: #000000; font-weight: bold;">&#41;</span>;
&nbsp;
	<span style="color: #006600;">// lendo quadro peda&ccedil;os de dados (tamanho m&eacute;dio)</span>
   ReadChunkFromFile<span style="color: #000000; font-weight: bold;">&#40;</span><span style="color: #0000ff;">file</span>, chunkszMedium * <span style="color: #000000;">4</span><span style="color: #000000; font-weight: bold;">&#41;</span>;
<span style="color: #000000; font-weight: bold;">&#125;</span>
&nbsp;
&nbsp;
<span style="color: #006600;">// P&oacute;s-processado</span>
<span style="color: #0000ff;">int</span> main<span style="color: #000000; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">&#41;</span>
<span style="color: #000000; font-weight: bold;">&#123;</span>
	<span style="color: #006600;">// lendo sei l&aacute; o que (perde alinhamento)</span>
   ReadChunkFromFile<span style="color: #000000; font-weight: bold;">&#40;</span><span style="color: #0000ff;">file</span>, 0x4000 + CHUNKSZ_BASE * <span style="color: #000000;">4</span><span style="color: #000000; font-weight: bold;">&#41;</span>;
&nbsp;
	<span style="color: #006600;">// lendo quadro peda&ccedil;os de dados (tamanho m&eacute;dio)</span>
   ReadChunkFromFile<span style="color: #000000; font-weight: bold;">&#40;</span><span style="color: #0000ff;">file</span>, chunkszMedium * <span style="color: #000000;">4</span><span style="color: #000000; font-weight: bold;">&#41;</span>;
<span style="color: #000000; font-weight: bold;">&#125;</span>
&nbsp;</pre></p>
<p><em>Aviso para os programadores mais calejados, eu omiti propositalmente os parênteses obrigatórios para qualquer define que tenha cálculos matemáticos, para ilustrar que muitas vezes o que vemos <strong>antes</strong> não é o que aparece <strong>depois.</strong></em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.caloni.com.br/blog/archives/enum/feed</wfw:commentRss>
		</item>
		<item>
		<title>Modificadores e qualificadores de tipo</title>
		<link>http://www.caloni.com.br/blog/archives/modificadores-e-qualificadores-de-tipo</link>
		<comments>http://www.caloni.com.br/blog/archives/modificadores-e-qualificadores-de-tipo#comments</comments>
		<pubDate>Fri, 28 May 2010 12:06:29 +0000</pubDate>
		<dc:creator>Wanderley Caloni</dc:creator>
		
		<category><![CDATA[C++]]></category>

		<guid isPermaLink="false">http://www.caloni.com.br/blog/archives/modificadores-e-qualificadores-de-tipo</guid>
		<description><![CDATA[@caloni poderia pensar em fazer um artigo sobre os modificadores de tipo em c? os mais complexo, acho eu: volatile, enum, union, extern, etc
Uma coisa de cada vez: existem modificadores (ou qualificadores) de tipo e especificadores de tipo. Volatile e extern se encaixam na primeira categoria, enum e union na segunda. Veremos um pouco desses [...]]]></description>
			<content:encoded><![CDATA[<blockquote><em>@caloni poderia pensar em fazer um artigo sobre os modificadores de tipo em c? os mais complexo, acho eu: volatile, enum, union, extern, etc</em></p></blockquote>
<p>Uma coisa de cada vez: existem <strong>modificadores </strong>(ou qualificadores) de tipo e <strong>especificadores</strong> de tipo. <em>Volatile</em> e <em>extern</em> se encaixam na primeira categoria, <em>enum</em> e <em>union</em> na segunda. Veremos um pouco desses dois lados da linguagem em doses paliativas.</p>
<h4>Padrão C (ISO/IEC 9899:1990)</h4>
<pre>6.5.2.2 enum-specifier
 <a href="http://www.caloni.com.br/blog/archives/enum">enum</a>

6.5.3 type-qualifier
 <a href="http://www.caloni.com.br/blog/archives/const-e-volatile">const</a>
 <a href="http://www.caloni.com.br/blog/archives/const-e-volatile">volatile</a>

6.5.2.1 struct-or-union
 struct
 union

6.5.1 storage-class-specifier
 typedef
 extern
 static
 auto
 register</pre>
<h4>Padrão C++ (ISO/IEC 14882:1998)</h4>
<pre>type-specifier
 <a href="http://www.caloni.com.br/blog/archives/enum">enum-specifier</a>

enum-specifier
 <a href="http://www.caloni.com.br/blog/archives/enum">enum</a>

cv-qualifier
 <a href="http://www.caloni.com.br/blog/archives/const-e-volatile">const</a>
 <a href="http://www.caloni.com.br/blog/archives/const-e-volatile">volatile</a>

class-key
 class
 struct
 union

storage-class-specifier
 auto
 register
 static
 extern
 mutable

decl-specifier
 storage-class-specifier
 typedef</pre>
<h4>Modificadores de tipo</h4>
<p>Um modificador de tipo é opcional na definição de um tipo e deve estar sempre relacionado com a declaração de alguma variável. Ele determina, em termos gerais, qual será a função dessa variável. Ela pode ser modificada? Onde ela se encontra no programa? Como ela será modificada?</p>
<p>Como exemplo rápido, temos abaixo uma variável que é atualizada pelo clock do processador e uma variável que não pode ser alterada após sua primeira atribuição:</p>
<pre>volatile int* clockSecs = &lt;algum-endereço-do-sistema&gt;;</pre>
<pre>
const float pi = 3.14;</pre>
<p>Fica meio óbvio que a primeira variável possui seu valor volátil, ou seja, muda conforme o tempo passa, e não depende do próprio código (pode mudar sem sua permissão). A segunda variável também tem um uso explícito, uma vez que o valor de pi nunca será alterado (não nesse Universo).</p>
<h4>Especificadores de tipo</h4>
<p>Os especificadores de tipo possuem cada um sua peculiaridade. Os mais peculiares, que veremos nos próximos artigos, serão as enumerações e as construções bizarras de structs e unions.</p>
<pre>enum Contador { um = 1, dois, tres, };</pre>
<pre>
union Atoms { struct { int part1; int part2; } parts; int64 total; };</pre>
<p>Aqui não é um compêndio teórico sobre a linguagem. Vamos falar particularmente da programação Windows, mas esteja livre para dar seus pitacos com respeito a outros sistemas operacionais e suas implementações igualmente exdrúxulas =)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.caloni.com.br/blog/archives/modificadores-e-qualificadores-de-tipo/feed</wfw:commentRss>
		</item>
		<item>
		<title>Typedef arcaico</title>
		<link>http://www.caloni.com.br/blog/archives/typedef-arcaico</link>
		<comments>http://www.caloni.com.br/blog/archives/typedef-arcaico#comments</comments>
		<pubDate>Tue, 20 Apr 2010 12:26:03 +0000</pubDate>
		<dc:creator>Wanderley Caloni</dc:creator>
		
		<category><![CDATA[C++]]></category>

		<guid isPermaLink="false">http://www.caloni.com.br/blog/archives/typedef-arcaico</guid>
		<description><![CDATA[











A API do Windows geralmente prima pela excelência em maus exemplos. A Notação Húngara e o Typedef Arcaico são duas técnicas que, por motivos históricos, são usados a torto e a direito pelos códigos de exemplo.
Já foi escrito muita coisa sobre os prós e contras da notação húngara. Já o typedef arcaico, esse pedacinho imprestável [...]]]></description>
			<content:encoded><![CDATA[











<p>A <a href="http://msdn.microsoft.com/" title="MSDN">API do Windows</a> geralmente prima pela excelência em maus exemplos. A <a href="http://pt.wikipedia.org/wiki/Nota%C3%A7%C3%A3o_h%C3%BAngara" title="Wikipédia">Notação Húngara</a> e o Typedef Arcaico são duas técnicas que, por motivos históricos, são usados a torto e a direito pelos códigos de exemplo.</p>
<p>Já foi escrito muita coisa sobre os prós e contras da notação húngara. Já o typedef arcaico, esse pedacinho imprestável de código, ficou esquecido, e hoje em dia traz mais dúvidas na cabeça dos principiantes em C<font color="#ff0000">++</font> do que deveria. Para tentar desobscurecer os mitos e fatos, vamos tentar explicar o que significa essa construção tão atípica, mas comum no dia-a-dia.</p>
<p>Vejamos um exemplo típico desse pequeno Frankenstein semântico:</p>
<pre>typedef struct _MINHASTRUCT {
   int x;
   int y;
}
MINHASTRUCT, *LPMINHASTRUCT;</pre>
<p>Bom, eu nem sei por onde começar. Talvez pelo conceito de typedef.</p>
<h4>Typedefs</h4>
<p>Um typedef, basicamente, é um apelido. Você informa um tipo e define "outro tipo".</p>
<pre>typedef &lt;tipo&gt; apelido;</pre>
<p>O &lt;tipo&gt; é tudo que fica entre o typedef e o novo nome, que deve ser um identificador válido na linguagem. Por exemplo, a empresa onde trabalho fez um typedef informal do meu nome:</p>
<pre>typedef Wanderley Caloni Wandeco;</pre>
<p>Se, futuramente, eu sair da empresa e entrar outro "Wanderley alguma-coisa", será possível usar o apelido novamente, bastando alterar o typedef:</p>
<pre>typedef Wanderley Cardoso Wandeco;</pre>
<blockquote><p><em>Bom, "outro tipo" é forma de dizer. Isso é uma descrição errônea em muitos livros. De fato, o compilador enxerga <strong>o mesmo tipo com outro nome</strong>, daí chamarmos o typedef de apelido, mesmo.</em></p></blockquote>
<blockquote><p><pre><span style="color: #006600;">/** @file dois_apelidos.cpp */</span>
<span style="color: #006600;">#include &lt;iostream&gt;</span>
&nbsp;
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std;
&nbsp;
<span style="color: #0000ff;">struct</span> Struct
<span style="color: #000000; font-weight: bold;">&#123;</span>
   <span style="color: #0000ff;">int</span> x;
   <span style="color: #0000ff;">int</span> y;
<span style="color: #000000; font-weight: bold;">&#125;</span>;
&nbsp;
<span style="color: #0000ff;">typedef</span> <span style="color: #0000ff;">Struct</span> Struct1;
<span style="color: #0000ff;">typedef</span> <span style="color: #0000ff;">Struct</span> Struct2;
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #000000; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">&#41;</span>
<span style="color: #000000; font-weight: bold;">&#123;</span>
   Struct1 s1;
   Struct2 s2;
&nbsp;
   <span style="color: #0000ff;">cout</span> &lt;&lt; <span style="color: #0000ff;">typeid</span><span style="color: #000000; font-weight: bold;">&#40;</span>s1<span style="color: #000000; font-weight: bold;">&#41;</span>.<span style="color: #000000;">name</span><span style="color: #000000; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">&#41;</span> &lt;&lt; endl;
   <span style="color: #0000ff;">cout</span> &lt;&lt; <span style="color: #0000ff;">typeid</span><span style="color: #000000; font-weight: bold;">&#40;</span>s2<span style="color: #000000; font-weight: bold;">&#41;</span>.<span style="color: #000000;">name</span><span style="color: #000000; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">&#41;</span> &lt;&lt; endl;
<span style="color: #000000; font-weight: bold;">&#125;</span></pre></p></blockquote>
<blockquote>
<pre>C:\Tests&gt;cl /EHsc dois_apelidos.cpp
...
/out:dois_apelidos.exe
dois_apelidos.obj

C:\Tests&gt;dois_apelidos.exe
<font color="#ff0000">struct Struct
struct Struct</font></pre>
</blockquote>
<h4>Granularidade dos tipos</h4>
<p>Tipos simples são fáceis de entender porque possuem seus símbolos no mesmo lugar:</p>
<pre><font color="#ff0000">int </font>x;
<font color="#ff0000">char </font>c;
<font color="#ff0000">long </font>p;</pre>
<p>Já os tipos um pouco mais complicados permite alguma mudança aqui e acolá:</p>
<pre><font color="#ff0000">int*</font> x;
<font color="#ff0000">char *</font>y;
<font color="#ff0000">long *</font> p;</pre>
<p>Essa liberdade da linguagem, mesmo sendo um recurso útil, pode ser bem nocivo dependendo de quem olha o código:</p>
<pre>int x, y; // dois inteiros
int * x, y; // um ponteiro para inteiro e um inteiro
int x, *y; // um inteiro e um ponteiro para inteiro
int *x, y; // um ponteiro para inteiro e um inteiro</pre>
<p>Em algumas formas da sintaxe, além de ser inevitável, gera bastante desconfiança:</p>
<pre>// Um ponteiro para função que recebe dois inteiros e não retorna nada.
typedef <font color="#ff0000">void (*</font>FP<font color="#ff0000">)(int, int)</font>;

// Um ponteiro para função que recebe dois inteiros e não retorna nada.
void (*)(int, int);

// Um cast para ponteiro para função que recebe dois inteiros e não retorna nada.
( ( <font color="#ff0000">void (*)(int, int)</font> ) pf )(x, y);</pre>
<p><pre><span style="color: #006600;">#include &lt;iostream&gt;</span>
&nbsp;
<span style="color: #0000ff;">void</span> func<span style="color: #000000; font-weight: bold;">&#40;</span><span style="color: #0000ff;">int</span> x, <span style="color: #0000ff;">int</span> y<span style="color: #000000; font-weight: bold;">&#41;</span>
<span style="color: #000000; font-weight: bold;">&#123;</span>
   std::<span style="color: #0000ff;">cout</span> &lt;&lt; x &lt;&lt; <span style="color: #666666;">'-'</span> &lt;&lt; y &lt;&lt; <span style="color: #666666;">'<span style="color: #666666;">\n</span>'</span>;
<span style="color: #000000; font-weight: bold;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #000000; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">&#41;</span>
<span style="color: #000000; font-weight: bold;">&#123;</span>
   <span style="color: #0000ff;">void</span>* pf = func;
   <span style="color: #000000; font-weight: bold;">&#40;</span> <span style="color: #000000; font-weight: bold;">&#40;</span> <span style="color: #0000ff;">void</span> <span style="color: #000000; font-weight: bold;">&#40;</span>*<span style="color: #000000; font-weight: bold;">&#41;</span><span style="color: #000000; font-weight: bold;">&#40;</span><span style="color: #0000ff;">int</span>, <span style="color: #0000ff;">int</span><span style="color: #000000; font-weight: bold;">&#41;</span> <span style="color: #000000; font-weight: bold;">&#41;</span> pf <span style="color: #000000; font-weight: bold;">&#41;</span><span style="color: #000000; font-weight: bold;">&#40;</span><span style="color: #000000;">3</span>, <span style="color: #000000;">14</span><span style="color: #000000; font-weight: bold;">&#41;</span>;
<span style="color: #000000; font-weight: bold;">&#125;</span></pre></p>
<h4>Structs em C<font color="#ff0000">++</font></h4>
<p>Antigamente, as structs eram construções em C que definiam <strong>um agregado de tipos primitivos</strong> (ou outras structs) e que poderiam gerar variáveis desse tipo em qualquer lugar, desde que informado seu nome e que se tratasse de uma struct:</p>
<p><pre><span style="color: #006600;">/** @file structs.cpp */</span>
<span style="color: #0000ff;">struct</span> MyStruct <span style="color: #000000; font-weight: bold;">&#123;</span> <span style="color: #0000ff;">int</span> x, y; <span style="color: #000000; font-weight: bold;">&#125;</span>;
&nbsp;
<span style="color: #0000ff;">void</span> func1<span style="color: #000000; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">&#41;</span>
<span style="color: #000000; font-weight: bold;">&#123;</span>
   <span style="color: #0000ff;">struct</span> MyStruct ms;
   <span style="color: #006600;">//...</span>
<span style="color: #000000; font-weight: bold;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> func2<span style="color: #000000; font-weight: bold;">&#40;</span><span style="color: #0000ff;">struct</span> MyStruct msa<span style="color: #000000; font-weight: bold;">&#41;</span>
<span style="color: #000000; font-weight: bold;">&#123;</span>
   <span style="color: #006600;">//...</span>
<span style="color: #000000; font-weight: bold;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #000000; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">&#41;</span>
<span style="color: #000000; font-weight: bold;">&#123;</span>
   <span style="color: #0000ff;">struct</span> MyStruct ms;
   func2<span style="color: #000000; font-weight: bold;">&#40;</span>ms<span style="color: #000000; font-weight: bold;">&#41;</span>;
<span style="color: #000000; font-weight: bold;">&#125;</span></pre></p>
<p>Para evitar toda essa digitação, os programadores usavam um pequeno truque criando um apelido para a estrutura, e usavam o apelido no lugar da struct (apesar de ambas representarem a mesma coisa).</p>
<pre><font color="#ff0000">struct MyStruct</font> { int x, y; };
typedef <font color="#ff0000">struct MyStruct</font> MS;</pre>
<p>ou</p>
<pre>typedef struct MyStruct { int x, y; } MS;
<font color="#ff0000">struct MyStruct</font> ms1; // ainda prolixo
<font color="#ff0000">MS</font> ms2; // mais simples</pre>
<p>Com a definição da linguagem C++ padrão, e mais moderna, essa antiguidade  foi removida, apesar de ainda suportada. Era possível usar apenas o nome  do struct como seu tipo:</p>
<p><pre><span style="color: #006600;">/** @file structs.cpp */</span>
<span style="color: #0000ff;">struct</span> MyStruct <span style="color: #000000; font-weight: bold;">&#123;</span> <span style="color: #0000ff;">int</span> x, y; <span style="color: #000000; font-weight: bold;">&#125;</span>;
&nbsp;
<span style="color: #0000ff;">void</span> func1<span style="color: #000000; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">&#41;</span>
<span style="color: #000000; font-weight: bold;">&#123;</span>
   <span style="color: #006600;">/*struct*/</span> MyStruct ms;
   <span style="color: #006600;">//...</span>
<span style="color: #000000; font-weight: bold;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> func2<span style="color: #000000; font-weight: bold;">&#40;</span><span style="color: #006600;">/*struct*/</span> MyStruct msa<span style="color: #000000; font-weight: bold;">&#41;</span>
<span style="color: #000000; font-weight: bold;">&#123;</span>
   <span style="color: #006600;">//...</span>
<span style="color: #000000; font-weight: bold;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #000000; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">&#41;</span>
<span style="color: #000000; font-weight: bold;">&#123;</span>
   <span style="color: #006600;">/*struct*/</span> MyStruct ms;
   func2<span style="color: #000000; font-weight: bold;">&#40;</span>ms<span style="color: #000000; font-weight: bold;">&#41;</span>;
<span style="color: #000000; font-weight: bold;">&#125;</span></pre></p>
<p>Porém, isso vai um pouco além de quando a Microsoft começou a fazer código para seu sistema operacional. Naquela época, o padrão ainda estava se formando e existia mais ou menos um consenso de como seria a linguagem C<font color="#ff0000">++</font> (sem muitas alterações do que de fato a linguagem C já era). De qualquer forma, a linguagem C imperava bem mais que C<font color="#ff0000">++</font>. Dessa forma, já era bem formada a ideia de como declarar uma struct: a forma antiga.</p>
<pre>typedef struct _MINHASTRUCT {
   int x;
   int y;
}
MINHASTRUCT, *LPMINHASTRUCT;</pre>
<p>Além do uso controverso do<strong> _sublinhado</strong> para nomear entidades (que no padrão foi recomendado que se reservasse aos nomes internos da biblioteca-padrão) e do uso de <strong>MAÍUSCULAS_NO_NOME</strong> (historicamente atribuído a nomes definidos no pré-processador), o uso do typedef atracado a um struct era muito difundido. E ficou ainda mais depois que a API do Windows foi publicada com essas definições.</p>
<h4>Como fazer,então?</h4>
<p>Ora, do mesmo jeito que é feito há vinte anos: sem typedefs. O próprio paradigma da linguagem, independente de padrões de APIs, de sistemas operacionais ou de projetos específicos já orienta o programador para entender o que o espera na leitura de um código-fonte qualquer. Qualquer pessoa que aprendeu o básico do básico sobre ponteiros e structs consegue ler o código abaixo:</p>
<p><pre><span style="color: #006600;">// Papai, o que que &eacute; isso?</span>
<span style="color: #006600;">// Ora, filho, apenas uma defini&ccedil;&atilde;o de estrutura!</span>
<span style="color: #006600;">//</span>
<span style="color: #0000ff;">struct</span> MinhaStruct <span style="color: #000000; font-weight: bold;">&#123;</span>
   <span style="color: #0000ff;">int</span> x;
   <span style="color: #0000ff;">int</span> y;
<span style="color: #000000; font-weight: bold;">&#125;</span>;
&nbsp;
<span style="color: #006600;">// muitas linhas abaixo...</span>
&nbsp;
<span style="color: #0000ff;">void</span> func<span style="color: #000000; font-weight: bold;">&#40;</span>MinhaStruct* ms<span style="color: #000000; font-weight: bold;">&#41;</span>
<span style="color: #000000; font-weight: bold;">&#123;</span>
   <span style="color: #006600;">// asterisco significa ponteiro para MinhaStruct!</span>
<span style="color: #000000; font-weight: bold;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #000000; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">&#41;</span>
<span style="color: #000000; font-weight: bold;">&#123;</span>
   MinhaStruct ms;
   func<span style="color: #000000; font-weight: bold;">&#40;</span>&amp;ms<span style="color: #000000; font-weight: bold;">&#41;</span>;
<span style="color: #000000; font-weight: bold;">&#125;</span></pre></p>
<p>Agora, para entender a forma antiga, ou você se baseou no copy&amp;paste dos modelos Microsoftianos, ou seja, decoreba, ou você é PhD em Linguagem C<font color="#ff0000">/C++</font> e padrões históricos de linguagens legadas. Se não é, deveria começar o curso agora.</p>
<p><pre><span style="color: #006600;">// Papai, o que que &eacute; isso?</span>
<span style="color: #006600;">// Ora, filho, apenas uma defini&ccedil;&atilde;o de sin&ocirc;nimo da struct</span>
<span style="color: #006600;">// _MINHASTRUCT, cujo nome n&atilde;o &eacute; usado, para dois nomes</span>
<span style="color: #006600;">// em mai&uacute;sculas, apesar se n&atilde;o serem defines, com uma</span>
<span style="color: #006600;">// nomenclatura de ponteiro que eu nunca vi na vida (obs: </span>
<span style="color: #006600;">// papai programa em um sistema n&atilde;o-Windows).</span>
<span style="color: #006600;">//</span>
<span style="color: #0000ff;">typedef</span> <span style="color: #0000ff;">struct</span> _MINHASTRUCT <span style="color: #000000; font-weight: bold;">&#123;</span>
   <span style="color: #0000ff;">int</span> x;
   <span style="color: #0000ff;">int</span> y;
<span style="color: #000000; font-weight: bold;">&#125;</span>
MINHASTRUCT, *LPMINHASTRUCT;
&nbsp;
<span style="color: #006600;">// muitas linhas abaixo...</span>
&nbsp;
<span style="color: #0000ff;">void</span> func<span style="color: #000000; font-weight: bold;">&#40;</span>LPMINHASTRUCT ms<span style="color: #000000; font-weight: bold;">&#41;</span>
<span style="color: #000000; font-weight: bold;">&#123;</span>
   <span style="color: #006600;">// o que diabos &eacute; um LP, mesmo?</span>
<span style="color: #000000; font-weight: bold;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #000000; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">&#41;</span>
<span style="color: #000000; font-weight: bold;">&#123;</span>
   MINHASTRUCT ms;
   func<span style="color: #000000; font-weight: bold;">&#40;</span>&amp;ms<span style="color: #000000; font-weight: bold;">&#41;</span>;
<span style="color: #000000; font-weight: bold;">&#125;</span></pre></p>
<p><img src="http://www.caloni.com.br/blog/wp-content/uploads/antes-depois.png" title="Código Antes x Depois no Visual Studio" alt="Código Antes x Depois no Visual Studio" align="bottom" />Da mesma forma, o uso de uma estrutura simples de tipos mantém a lista de nomes do seu projeto limpa e clara. Compare o visualizador de classes em projetos Windows com algo mais C++ para ter uma ideia.</p>
<p>É claro, essa é apenas uma sugestão. Existem vantagens em sua utilização. Existe alguma vantagem no modo antigo? Existe: a Microsoft usa, e talvez mais pessoas usem. Basta a você decidir qual deve ser o melhor caminho.</p>
<h4>Atualização</h4>
<p>De acordo com o leitor  <a href="http://www.caloni.com.br/blog/archives/typedef-arcaico#comment-17016" title="Comentário do blogue">Adriano dos Santos Fernandes</a>, a obrigatoriedade do nome struct após seu nome continua valendo para a linguagem C padrão, assim como no compilador GCC ocorre um erro ao tentar omiti-la. Apenas na linguagem C++ essa obrigatoriedade não existe mais.</p>
<p>Eu não fiz meus testes, mas confio no diagnóstico de nosso amigo. A maior falha do artigo, no entanto, é usar a linguagem C como base, quando na verdade ele deveria falar sobre o uso desses typedefs em C++. Esse erro também foi corrigido no original.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.caloni.com.br/blog/archives/typedef-arcaico/feed</wfw:commentRss>
		</item>
		<item>
		<title>Name mangling</title>
		<link>http://www.caloni.com.br/blog/archives/name-mangling</link>
		<comments>http://www.caloni.com.br/blog/archives/name-mangling#comments</comments>
		<pubDate>Mon, 13 Jul 2009 09:00:32 +0000</pubDate>
		<dc:creator>Wanderley Caloni</dc:creator>
		
		<category><![CDATA[C++]]></category>

		<guid isPermaLink="false">http://www.caloni.com.br/blog/archives/name-mangling</guid>
		<description><![CDATA[A sobrecarga estática possui algumas desvantagens em relação ao sistema de nomes da boa e velha linguagem C: ela não foi padronizada entre compiladores. O que isso quer dizer na prática é que funções exportadas de bibliotecas dinâmicas (DLLs) vão possuir nomes diferentes dependendo do compilador utilizado (e sua versão). Isso é o que chamamos [...]]]></description>
			<content:encoded><![CDATA[<p>A <a href="http://www.caloni.com.br/blog/archives/polimorfismo-estatico">sobrecarga estática</a> possui algumas desvantagens em relação ao sistema de nomes da boa e velha linguagem C: ela <strong>não foi padronizada</strong> entre compiladores. O que isso quer dizer na prática é que funções exportadas de bibliotecas dinâmicas (DLLs) vão possuir nomes diferentes dependendo do compilador utilizado (e sua versão). Isso é o que chamamos <a href="http://en.wikipedia.org/wiki/Name_mangling" title="Name mangling na Wikipedia.">name mangling</a>.</p>
<p>Em dois projetos usando Visual C++ 2008 e Borland C++ Builder 5 (última versão que funciona direito) eu fiz uma exportação da função soma em linguagem C (o fonte é um .c). Veja o resultado:</p>
<p><img src="http://www.caloni.com.br/blog/wp-content/uploads/name-mangling-borland-c.png" alt="name-mangling-borland-c.png" /></p>
<p><img src="http://www.caloni.com.br/blog/wp-content/uploads/name-mangling-vcpp-c.png" alt="name-mangling-vcpp-c.png" /></p>
<p>Já usando a linguagem C++ (o fonte é um .cpp) temos outro resultado totalmente diferente para nossas duas funções soma descritas <a href="http://www.caloni.com.br/blog/archives/polimorfismo-estatico">no artigo anterior</a>:</p>
<p><img src="http://www.caloni.com.br/blog/wp-content/uploads/name-mangling-borland-cpp.png" alt="name-mangling-borland-cpp.png" /></p>
<p><img src="http://www.caloni.com.br/blog/wp-content/uploads/name-mangling-vcpp-cpp.png" alt="name-mangling-vcpp-cpp.png" /></p>
<p>Se quiser tentar entender essas letrinhas bizarras, recomendo baixar <a href="http://www.caloni.com.br/blog/wp-content/uploads/name-mangling.7z" title="name-mangling.7z">projetos de exemplo</a>. Se apenas entender que você não conseguirá juntar classes VC++ e Builder usando <strong><a href="http://msdn.microsoft.com/en-us/library/a90k134d(VS.80).aspx">dllexport</a></strong> para tudo quanto é lado, então terminamos por aqui.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.caloni.com.br/blog/archives/name-mangling/feed</wfw:commentRss>
		</item>
		<item>
		<title>Polimorfismo estático</title>
		<link>http://www.caloni.com.br/blog/archives/polimorfismo-estatico</link>
		<comments>http://www.caloni.com.br/blog/archives/polimorfismo-estatico#comments</comments>
		<pubDate>Fri, 10 Jul 2009 17:44:34 +0000</pubDate>
		<dc:creator>Wanderley Caloni</dc:creator>
		
		<category><![CDATA[C++]]></category>

		<guid isPermaLink="false">http://www.caloni.com.br/blog/archives/polimorfismo-estatico</guid>
		<description><![CDATA[

Para explicar polimorfismo, nada como ver as coisas como elas eram. Se você fosse um programador C de vinte anos atrás e criasse as seguintes funções:
int soma&#40;int x, int y&#41;;
double soma&#40;double x, double y&#41;;
&#160;
int main&#40;&#41;
&#123;
    int zi = soma&#40;2, 3&#41;;
    double zd = soma&#40;2.5, 3.4&#41;;
    return [...]]]></description>
			<content:encoded><![CDATA[

<p>Para explicar polimorfismo, nada como ver as coisas como elas eram. Se você fosse um programador C de vinte anos atrás e criasse as seguintes funções:</p>
<p><pre><span style="color: #0000ff;">int</span> soma<span style="color: #000000; font-weight: bold;">&#40;</span><span style="color: #0000ff;">int</span> x, <span style="color: #0000ff;">int</span> y<span style="color: #000000; font-weight: bold;">&#41;</span>;
<span style="color: #0000ff;">double</span> soma<span style="color: #000000; font-weight: bold;">&#40;</span><span style="color: #0000ff;">double</span> x, <span style="color: #0000ff;">double</span> y<span style="color: #000000; font-weight: bold;">&#41;</span>;
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #000000; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">&#41;</span>
<span style="color: #000000; font-weight: bold;">&#123;</span>
    <span style="color: #0000ff;">int</span> zi = soma<span style="color: #000000; font-weight: bold;">&#40;</span><span style="color: #000000;">2</span>, <span style="color: #000000;">3</span><span style="color: #000000; font-weight: bold;">&#41;</span>;
    <span style="color: #0000ff;">double</span> zd = soma<span style="color: #000000; font-weight: bold;">&#40;</span><span style="color: #000000;">2</span>.<span style="color: #000000;">5</span>, <span style="color: #000000;">3</span>.<span style="color: #000000;">4</span><span style="color: #000000; font-weight: bold;">&#41;</span>;
    <span style="color: #0000ff;">return</span> <span style="color: #000000;">0</span>;
<span style="color: #000000; font-weight: bold;">&#125;</span>
&nbsp;</pre></p>
<p>Imediatamente o compilador iria acusar os seguintes erros:</p>
<pre>overload.c</pre>
<pre>overload.c(2) : warning C4028: formal parameter 1 different from declaration
overload.c(2) : warning C4028: formal parameter 2 different from declaration
overload.c(2) : error C2371: 'soma' : redefinition; different basic types
        overload.c(1) : see declaration of 'soma'</pre>
<p>Isso acontece porque em C <strong>os identificadores são únicos por escopo</strong>. Esse é o motivo por que o seguinte código também está errado:</p>
<p><pre><span style="color: #0000ff;">int</span> main<span style="color: #000000; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">&#41;</span>
<span style="color: #000000; font-weight: bold;">&#123;</span>
    <span style="color: #0000ff;">int</span> x = <span style="color: #000000;">0</span>;
    <span style="color: #0000ff;">int</span> x = <span style="color: #000000;">1</span>;
    <span style="color: #0000ff;">return</span> <span style="color: #000000;">0</span>;
<span style="color: #000000; font-weight: bold;">&#125;</span>
&nbsp;
&nbsp;</pre></p>
<pre>overload.c
overload.c(5) : error C2374: 'x' : redefinition; multiple initialization
        overload.c(4) : see declaration of 'x'</pre>
<p>De volta aos anos 90, isso também está errado em C++. Até por uma questão de lógica: como o compilador pode saber a qual variável estamos nos referindo se usarmos o mesmo nome para duas delas?</p>
<p>Só que existe um truquezinho para impedir essa ambiguidade quando falamos de funções: os parâmetros que ela recebe.</p>
<p><pre><span style="color: #0000ff;">int</span> soma<span style="color: #000000; font-weight: bold;">&#40;</span><span style="color: #0000ff;">int</span> x, <span style="color: #0000ff;">int</span> y<span style="color: #000000; font-weight: bold;">&#41;</span>;
<span style="color: #0000ff;">double</span> soma<span style="color: #000000; font-weight: bold;">&#40;</span><span style="color: #0000ff;">double</span> x, <span style="color: #0000ff;">double</span> y<span style="color: #000000; font-weight: bold;">&#41;</span>;
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #000000; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">&#41;</span>
<span style="color: #000000; font-weight: bold;">&#123;</span>
    <span style="color: #0000ff;">int</span> zi = soma<span style="color: #000000; font-weight: bold;">&#40;</span><span style="color: #000000;">2</span>, <span style="color: #000000;">3</span><span style="color: #000000; font-weight: bold;">&#41;</span>; <span style="color: #006600;">// dois tipos int: chamar soma(int, int)</span>
    <span style="color: #0000ff;">double</span> zd = soma<span style="color: #000000; font-weight: bold;">&#40;</span><span style="color: #000000;">2</span>.<span style="color: #000000;">5</span>, <span style="color: #000000;">3</span>.<span style="color: #000000;">4</span><span style="color: #000000; font-weight: bold;">&#41;</span>; <span style="color: #006600;">// dois tipos double: s&oacute; pode ser soma(double, double)</span>
    <span style="color: #0000ff;">return</span> <span style="color: #000000;">0</span>;
<span style="color: #000000; font-weight: bold;">&#125;</span>
&nbsp;</pre></p>
<pre>C:\Tests&gt;cl /c overload.cpp
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 13.10.6030 for 80x86
Copyright (C) Microsoft Corporation 1984-2002. All rights reserved.

overload.cpp

C:\Tests&gt;</pre>
<p>Isso permitiu que em C++ fosse criada a sobrecarga estática, que é exatamente isso: chamar a função não apenas de acordo com seu nome, mas também de acordo com sua assinatura, ou seja, o número e o tipo dos parâmetros recebidos. Chamamos de sobrecarga estática porque isso é feito apenas pelo compilador, não pesando em nada durante a execução do programa.</p>
<p>Entre seus usos mais comuns estão os seguintes:</p>
<ul>
<li>Ter funções com o mesmo nome mas que tratam de diferentes parâmetros;
<ul>
<li>soma(int, int);</li>
<li>soma(double, double);</li>
<li>Obs.: Isso ignora, é claro, as facilidades dos templates.</li>
</ul>
</li>
<li>Versões novas da mesma função que recebem parâmetros adicionais;
<ul>
<li>export_data(void* buffer, int size);</li>
<li>export_data(void* buffer, int size, unsigned long options);</li>
</ul>
</li>
<li>Mesmo nome de método para setar e obter o valor de uma propriedade;
<ul>
<li>Class::Property(int x); // setter</li>
<li>int x Class::Property() const; // getter</li>
</ul>
</li>
<li>Bom, o que mais sua imaginação mandar =)</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.caloni.com.br/blog/archives/polimorfismo-estatico/feed</wfw:commentRss>
		</item>
		<item>
		<title>Strings</title>
		<link>http://www.caloni.com.br/blog/archives/strings</link>
		<comments>http://www.caloni.com.br/blog/archives/strings#comments</comments>
		<pubDate>Tue, 07 Jul 2009 12:46:08 +0000</pubDate>
		<dc:creator>Wanderley Caloni</dc:creator>
		
		<category><![CDATA[C++]]></category>

		<category><![CDATA[Programação]]></category>

		<guid isPermaLink="false">http://www.caloni.com.br/blog/archives/strings</guid>
		<description><![CDATA[Como já vimos centenas e centenas de vezes, memória é apenas memória até que alguém diga que isso vale alguma coisa. Em seu estado latente é o que chamamos formalmente de dados. E dados são bytes armazenados na memória.
No entanto, quando esses dados viram algo de útil em um determinado contexto, não necessariamente alterando-se seu [...]]]></description>
			<content:encoded><![CDATA[<p>Como já vimos <a href="http://www.caloni.com.br/blog/archives/basico-do-basico-tipos">centenas</a> e <a href="http://www.caloni.com.br/blog/archives/guia-basico-para-programadores-de-primeiro-int-main">centenas</a> de vezes, memória é apenas memória até que alguém diga que isso vale alguma coisa. Em seu estado latente é o que chamamos formalmente de <strong>dados</strong>. E dados são bytes armazenados na memória.</p>
<p>No entanto, quando esses dados viram algo de útil em um determinado contexto, não necessariamente alterando-se seu conteúdo na memória, passamos a lidar com informação. Ou seja, é um dado com <strong>significado</strong>. E informação é a interpretação desses mesmos dados.</p>
<p>A conclusão óbvia para isso, falando de strings, é: uma série de bytes enfileirados na memória pode ser uma string.</p>
<p>Para tanto precisamos apenas de dados (os bytes enfileirados) e significado (uma tabela de símbolos que traduza esses bytes para caracteres e a definição de como a string se organiza).</p>
<p>Por exemplo, uma série de bytes diferentes de zero com valores que representam índices de uma tabela de tradução de caracteres e que termina sua sequência em um byte com o valor zero nele é considerada uma string C, ou string terminada em nulo.</p>
<p><a href="http://www.caloni.com.br/blog/wp-content/uploads/stringc.png" title="String C"><img src="http://www.caloni.com.br/blog/wp-content/uploads/stringc.png" alt="String C" width="628" height="429" /></a></p>
<p>Já uma mesma sequência de bytes no mesmo molde só que sem o byte final com o valor zero, mas com um byte inicial que tem como valor não um índice de caractere, mas o número de bytes subsequentes, isso é uma string Pascal, ou uma string com contador de tamanho.</p>
<p><a href="http://www.caloni.com.br/blog/wp-content/uploads/stringpascal.png" title="String Pascal"><img src="http://www.caloni.com.br/blog/wp-content/uploads/stringpascal.png" alt="String Pascal" width="631" height="405" /></a></p>
<p>Agora note por que tanto uma string vazia em Pascal e em C possuem os mesmos dados, mas informação diferente.</p>
<p>Outras strings que não necessariamente possuem terminador nulo: <a href="http://www.cplusplus.com/reference/string/string/">std::string</a>, <a href="http://msdn.microsoft.com/en-us/library/aa380518(VS.85).aspx">UNICODE_STRING</a>, <a href="http://www.driverentry.com.br/blog/2009/07/strings-no-kernel.html">strings no kernel</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.caloni.com.br/blog/archives/strings/feed</wfw:commentRss>
		</item>
		<item>
		<title>Últimas pesquisas na blogosfera nacional</title>
		<link>http://www.caloni.com.br/blog/archives/ultimas-pesquisas-na-blogosfera-nacional</link>
		<comments>http://www.caloni.com.br/blog/archives/ultimas-pesquisas-na-blogosfera-nacional#comments</comments>
		<pubDate>Fri, 08 May 2009 10:50:40 +0000</pubDate>
		<dc:creator>Wanderley Caloni</dc:creator>
		
		<category><![CDATA[Devaneando]]></category>

		<category><![CDATA[C++]]></category>

		<guid isPermaLink="false">http://www.caloni.com.br/blog/archives/ultimas-pesquisas-na-blogosfera-nacional</guid>
		<description><![CDATA[ É um imenso prazer constatar que hoje, mais de dez anos depois de eu ter iniciado minha caminhada pelo mundo da programação C/C++, temos uma reação de blogues e saites prontos para elucidar questões simples e avançadas dessas duas linguagens que ainda não morreram e, se depender de como as coisas andam, ainda vão [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.caloni.com.br/blog/wp-content/uploads/brasil-matrix.png" title="Mapa do Brasil com o código do filme Matrix" alt="Mapa do Brasil com o código do filme Matrix" align="left" /> É um imenso prazer constatar que hoje, mais de dez anos depois de eu ter iniciado minha caminhada pelo mundo da programação C/C++, temos uma reação de blogues e saites prontos para elucidar questões simples e avançadas dessas duas linguagens que ainda não morreram e, se depender de como as coisas andam, ainda vão durar pelo menos mais uns dez anos (sim, não sou tão otimista assim).</p>
<p>Esse artigo é só para constar em minha lista de referência para o aprendizado de C, C++ e todas as outras coisas que vem depois. Se eu tivesse que escrever isso lá no início, provavelmente recomendaria mais linques de livros e saites em inglês. Hoje, felizmente, temos um conteúdo em pleno desenvolvimento em nossa blogosfera tupiniquim. E espero que continue assim!</p>
<h4>C/C++</h4>
<ul>
<li><a href="http://bcsanches.wordpress.com/2008/12/11/strings-em-c/">Strings</a></li>
<li><a href="http://bcsanches.wordpress.com/2009/01/23/strings-e-numeros/">Strings e Números</a></li>
<li>Os <a href="http://bcsanches.wordpress.com/2008/08/27/c-type-casting-1%c2%aa-parte/">diversos</a> <a href="http://bcsanches.wordpress.com/2008/09/18/c-type-casting-2%c2%aa-parte/">tipos</a> de <a href="http://bcsanches.wordpress.com/2008/11/05/c-type-casting-3%c2%aa-e-ultima-parte/">casting</a></li>
<li><a href="http://blog.blabos.org/2009/04/ponteiros-e-referencias-em-c-parte-1/">Pointeiros</a> e <a href="http://blog.blabos.org/2009/05/ponteiros-e-referencias-em-c-parte-2/">Referências</a></li>
<li><a href="http://www.thradams.com/codeblog/templates.pdf">Templates</a></li>
<li><a href="http://bcsanches.wordpress.com/2008/05/29/smart-pointers-introducao/">Smart Pointer - Introdução</a></li>
<li><a href="http://bcsanches.wordpress.com/2008/06/10/auto-pointers/">Auto Pointer (auto_ptr)</a></li>
<li>Boost <a href="http://bcsanches.wordpress.com/2008/07/09/boost-shared-pointers/">Shared Pointer</a>, <a href="http://bcsanches.wordpress.com/2008/07/17/boost-weak-pointer-weak_ptr/">Weak Pointer</a> e <a href="http://bcsanches.wordpress.com/2008/07/09/boost-shared-pointers/">Scoped Pointer</a></li>
<li>Boost <a href="http://bcsanches.wordpress.com/2008/07/30/boost-shared-array-e-scoped-array-shared_array-e-scoped_array/">Shared Array e Scoped Array </a></li>
<li><a href="http://devhints.blogspot.com/2008/12/c-quando-usar-cada-smart-pointer.html">Quando usar cada um dos smart pointers</a></li>
<li><a href="http://groups.google.com/group/ccppbrasil/topics">As infinitas e riquíssimas discussões na lista C/C++</a></li>
</ul>
<h4>Visual Studio</h4>
<ul>
<li><a href="http://bcsanches.wordpress.com/2009/03/06/como-utilizar-o-visual-studio-c-parte-1/">Como usar</a> o <a href="http://bcsanches.wordpress.com/2009/04/01/como-utilizar-o-visual-studio-c-parte-2/">Visual</a> <a href="http://bcsanches.wordpress.com/2009/04/22/como-utilizar-o-visual-studio-parte-3/">Studio</a></li>
<li><a href="http://bcsanches.wordpress.com/2008/05/14/compilando-a-boost-no-windows-usando-visual-studio/">Compilando o Boost no Windows (usando Visual Studio)</a></li>
</ul>
<h4>Mais assuntos?</h4>
<p>A internet brasileira cresceu como um todo. Mesmo que você deseje saber mais sobre <a href="http://dqsoft.blogspot.com/search/label/Processadores">microprocessadores</a> ou <a href="http://www.driverentry.com.br">drivers para Windows</a>, em português, hoje isso é possível. É claro que o que não é possível é você se dedicar profissionalmente a essas áreas <a href="http://www.caloni.com.br/blog/archives/developer-you-need-to-know-english" title="Developer you need to know English">sem saber inglês</a>. Mas é uma muito bem-vinda manifestação das pessoas que fazem acontecer todas essas coisas em nosso país.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.caloni.com.br/blog/archives/ultimas-pesquisas-na-blogosfera-nacional/feed</wfw:commentRss>
		</item>
	</channel>
</rss>
