Raio_ do_ C_ precisa_ porque_?

Programação C em geral

Moderadores: 51, guest2003

Raio_ do_ C_ precisa_ porque_?

Mensagempor Djalma Toledo Rodrigues » 07 Set 2008 20:14

Porque_o_raio_do_C_precisa_ do_raio_deste_Caracter_"_"_ ?

Eu_não_'Çabo' :lol:
Editado pela última vez por Djalma Toledo Rodrigues em 08 Set 2008 00:47, em um total de 1 vez.
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor Maurício » 07 Set 2008 22:17

Depende do contexto.

Quando o programa é compilado, eu não sei, mas, quando vc vai declarar variáveis que comecem com números, ele é obrigatório.

Eu só uso isso daí pra separar variáveis literais. Só isso.

[]'s
"Não leve a vida tão à sério, afinal, nenhum de nós sairá vivo, dela!"
Avatar do usuário
Maurício
Word
 
Mensagens: 678
Registrado em: 14 Out 2006 17:23
Localização: São Paulo - SP

Mensagempor msamsoniuk » 08 Set 2008 00:06

bom, primeiro de tudo tem que diferenciar o que eh caractere reservado de caractere nao reservado. a linguagem C eh altamente simbologica, entao muitos caracteres sao reservados: parenteses, colchetes, chaves, operadores aritmeticos, logicos, etc.

em particular, os caracteres A-Z, a-z e _ nao sao reservados para nada. isso significa que vc pode usar eles livremente em nomes de funcoes e variaveis. em especial, nao existe nenhuma restricao quanto ao uso de _ no comeco, meio ou fim de um nome! como _ nao tem diferenca especial de qq outro caractere, usar _314 ou X314 para diferenciar do numero 314 dah absolutamente na mesma.

bom, isso eh a posicao oficial. agora tem a parte extra oficial que muda consideravelmente as coisas: a tradicao.

a linguagem C eh relativamente moderna, surgiu em minicomputadores. mas muitas outras linguagens anteriores surgiram na epoca do cartao perfurado, onde nao era possivel diferenciar maiusculas de minusculas. assim, adicionava-se _ para melhorar a legibilidade, de modo que ENDOFFILE tornava-se END_OF_FILE.

a linguagem C nao possui essa restricao, mas na decada de 70 a tradicao falou mais forte e a notacao tradicional end_of_file ou END_OF_FILE era muito mais popular do que EndOfFile.

outro ponto onde a tradicao pegou foi na linkagem: como era muito comum a colisao de simbolos do assembler com os simbolos da linguagem de alto nivel, adotou-se como pratica a adicao de _ na frente dos simbolos gerados pelo compilador. ateh hoje muitos compiladores adotam essa pratica e muitos sistemas operacionais impoe o uso dessa notacao. pelo mesmo motivo, usou-se a tradicao para evitar outras colisoes e hoje temos aberracoes estranhas como as diretivas __TIME__ e __DATE__, adicionadas ao pre-processador por algum fundamentalista do cartao perfurado.

eh claro que a tradicao nem sempre manda: o gcc por exemplo eh um compilador que nao adiciona _ na frente dos simbolos e isso facilita muito a vida. ao contrario do que se supoe, a colisao de simbolos entre codigo assembler e codigo compilado normalmente eh o que se deseja! e mesmo o unix, na decada de 70, nao adotou a forma tradicional de se escrever end of file: ao inves de EndOfFile, END_OF_FILE ou end_of_file, usou-se a enigmatica sigla EOF :)
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Mensagempor msamsoniuk » 08 Set 2008 00:43

Djalma Toledo Rodrigues escreveu:Bem, mas quando C é compilado ele se transforma no Prog. Objeto , isto é, se transforma em Linguagem de Máquina. Não é ?


sim, mas os simbolos tem que continuar presentes, visto que todos os sistemas operacionais modernos usam linkagem dinamica. pior, se o resto do sistema usa _ na frente dos simbolos, ateh o compilador pascal vai ter que usar, senao ele nao consegue linkar dinamicamente recursos basicos do sistema operacional.

no linux, em particular, o numero de simbolos com _ eh bem pequena.

por exemplo:

root@darkstar:~# objdump -T /bin/ls | grep str
00000000 DF *UND* 00000167 GLIBC_2.0 strchr
00000000 DF *UND* 00000043 GLIBC_2.0 strcmp
00000000 DF *UND* 0000005d GLIBC_2.0 strftime
00000000 DF *UND* 000000af GLIBC_2.0 strlen
00000000 DF *UND* 0000005d GLIBC_2.0 __strtoull_internal
00000000 DF *UND* 0000015d GLIBC_2.1 strverscmp
00000000 DF *UND* 0000011f GLIBC_2.0 strncmp
00000000 DF *UND* 000001b9 GLIBC_2.0 strrchr
00000000 DF *UND* 0000004f GLIBC_2.0 strcoll
00000000 DF *UND* 000000b9 GLIBC_2.0 strncpy
00000000 DF *UND* 0000005d GLIBC_2.0 __strtoul_internal
00000000 DF *UND* 00000030 GLIBC_2.0 strcpy

tem dois pilantrinhas ali com __, mas supostamente nao fazem parte da API oficial... ao menos nunca ouvi falar neles, deve ser coisa do proex.
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Mensagempor Djalma Toledo Rodrigues » 08 Set 2008 00:52

Entendi
Obrigado Mauricio
Obrigado Marcelo
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22


Voltar para Visual C++/C/C++/C#

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 0 visitantes

x