Ir ao conteúdo
  • Cadastre-se

C++ Convenção de linguagem, em C underline, começando variável é o que?


sandrofabres

Posts recomendados

Existe alguns padrões de nomes para variáveis que algumas linguagens segue, em C/C++ um desses padrões me chama atenção, o uso de
underline começando o nome de variáveis, o que representa? Eu canso de ver programadores avançados fazerem isso:
 _indiaTaiane = 0xfc;

_CryptHashDataNenem_prt = (homos *)

__ASM__

 

O que quer dizer esses underlines?

 

Outra coisa aproveitando o assunto, por que algumas APIs do windows terminam com letras estranhas que não parecem ter nexo, é notação ungara?

Por exemplo:

LoadLibraryA("veraMagalhaesEstadodeSaoPaulo.dll");
CreateFontW();

MoveFileW(morcegonia_1, aqui_248);
GetTempPathW(L"\\normadeisemonds.jpg");

 

O que quer dizer esse A, depois W maiúsculo no fim do nome das funções?

 

 

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

O W (CreateFontW, MoveFileW, etc.) é a versão da função que usa o tipo WCHAR (VERSÃO UNICODE - wide caractere) para representar os strings. Enquanto o CHAR usa 1 byte (8 bits) para representar um caractere o WCHAR usa 4 bytes (32 bits)(?). Assim você consegue suporte ao UNICODE UTF-32 - representar caracteres e símbolos (especialmente internacionais) que o CHAR comum não consegue. 

 

As função que terminam em A (VERSÃO ANSI) usam o CHAR de 8bits padrão.

 

Se você chamar a função sem A ou W no final, o compilador vai escolher a versão dependendo das diretivas de compilação especificadas.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

9 horas atrás, sandrofabres disse:

underline começando o nome de variáveis, o que representa? Eu canso de ver programadores avançados fazerem isso:
 _indiaTaiane = 0xfc;

_CryptHashDataNenem_prt = (homos *)

__ASM__

Canso de ver e nunca perguntou o porquê do estilo, rapaz!!!

 

O único manual de estilo na vida que precisei The Elements of Programming Style by Kernighan.

 

Acredito que são indicadores, para uso e com mais atenção as recomendações do programador (es) ou da linguagem no caso. Geralmente se não é uma palavra reservada deve ser vista como uma, foram definidas para se diferenciar de outra, e também, há casos de uso interno.

 

Exemplos

__func __ 

 

stdbool.h

_Bool tem sinônimo bool.

 

 

 

 

 

Extra: Não se cria um novo tipo.

Citação

Kernighan, Brain W.; Ritchie, Dennis M.(1988). A linguagem de programação C (2ª ed.). Englewood Cliffs, New Jersey .: Prentice Hall. p. 147. ISBN 0-13-110362-8.

Retirado em  2016.

 

C fornece um recurso chamado typedef para criar novos nomes de tipo de dados. … Deve ser enfatizado que uma declaração de typedef não cria um novo tipo em nenhum sentido; ele simplesmente adiciona um novo nome para algum tipo existente.

 

 

"

 

 

 

Link para o comentário
Compartilhar em outros sites

Além das explicações do Mauro e do Flávio, a linguagem Python incluiu uma convenção que vem tornando-se um padrão em C e derivados, usar "_" no inicio dos identificadores de membros privados em classes. Assim práticas relativamente velhas, como em C++, nos quais acessibilidade seria controlada por uma palavra reservada, e.g. public ou private, é reduzida a algo bem mais simples nos quais tudo é público, e o membro que inicia com "_" é reservada pra uso interno. Tudo controlado pelo programador e pelo cliente.

 

Aos poucos essa nova tendência pode eventualmente aparecer nos novos guias de boas práticas. Já vi o uso em pelo menos dois projetos grandes relacionados a game engines com C++ e num projeto cientifico em C (na minha área de atuação profissional).

 

Pessoalmente, eu até gosto da nova prática mas acho que deveríamos utilizar "_ _" pra limitar a possibilidade de conflito com Instâncias no código cliente.

  • Curtir 1
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

3 horas atrás, V!OLADOR disse:

a linguagem Python incluiu uma convenção que vem tornando-se um padrão em C

 

Meio fora de tópico mas Python tem um tratamento bem particular para underline no começo de variáveis e por uma razão bem distinta. E não se esqueça que métodos especiais em Python tem a convenção de começar e terminar por dois underlines, como o próprio construtor de classe... Veja __init__ __add__ __less__ por exemplo

 

E veja na documentação um tópico chamado name mangling. Eu não sei como se diz isso em português. :( 

Essa convenção nada tem a ver com C ou java ou C++ ou qualquer outra linguagem, exceto pelo fato de que Python não tem modificadores de acesso e então se criou essa convenção para diminuir o impacto de colisão de nomes em subclasses porque pode virar um 1nfern0

 

4 horas atrás, V!OLADOR disse:

public ou private

 

java, C++, javascript, C++ e outras tem esses modificadores de acesso, private, protected., public, internal, default... Eles tem m papel importante em encapsulamento e polimorfismo em orientação a objetos. E alguns podem achar que faz falta em Python quando não é usada para ensinar programação para principiantes.

 

De volta ao tópico: em C e C++

 

Em C isso não é muito importante. Trata-se de uma convenção para identificar variáveis que são membros de uma struct, facilitando a leitura e compreensão do programa. Só que em C as estruturas não tem código e você tem que repetir o prefixo toda vez. Veja o que vou explicar a seguir sobre o comando with.

 

Quando surgiu C a linguagem politicamente correta era Pascal. Hoje talvez seja Python o equivalente ideológico: menos convenções, mais liberdade em umas coisas, mais controle em outras...

 

Em Pascal uma convenção assim é útil. Em Visual Basic também. Em javascript também. Existe um comando With nessas linguagens e é útil em certos casos: ele permite criar um bloco onde a variável do with é um prefixo para acessar uma estrutura. E como a função pode ter outras variáveis que não fazem parte da struct é muito bom poder ter uma convenção no código que identifique dentro do loop as chamadas variáveis-membro. E ao mesmo tempo não ter que repetir aquele prefixo toda hora.

 

Em C++ não tem esse comando. E por isso em C++ e outras linguagens tem empresas e autores que  recomendam prefixar uma variável ou função valor membro da classe escrevendo m_valor ou _valor ou mesmo valor_ , ou mesmo _VALOR porque ao ler o programa você tem mais clara a origem da variável. E é o mesmo caso em todas essas linguagens, exceto Python onde a razão é outra.  

 

Algo como a Microsoft usa no Windows desde os '80. Direto de windows.h:
 

    LPDWORD test;
    PDWORD  outro;
    WORD    coisa;

 

É a mesma ideia: prefixos: veja a convenção: tudo em maiúsculas, prefixo L para um tipo de ponteiro, P para um ponteiro comum...
 

4 horas atrás, V!OLADOR disse:

nova prática mas acho que deveríamos utilizar "_ _" pra limitar a possibilidade de conflito com Instâncias no código cliente

 

Nao é novo. Desde os RECORD em Algol tinha gente que recomendava isso para os componentes de RECORD e isso vem desde os '60. Escrevi em maiúscula porque nadquela época não havia minúsculas :D e COBOL reinava com FORTRAN nas empresas e academia

Link para o comentário
Compartilhar em outros sites

47 minutos atrás, arfneto disse:

Essa convenção nada tem a ver com C ou java ou C++

 

Bom, a afirmação correta deveria ser: essa convenção nada teria a ver com C e C++. Apenas começa a ter. Como expliquei acima, e por influência de Python (a maioria dos programadores desses novos projetos tiveram um ensino formal em Python). 

 

O tema tampouco é novo. Por exemplo, na GSL (GNU Scientific Library), vemos um ótimo exemplo de um projeto em C com orientação a objeto e encapsulamento (no estilo C, obviamente) e utilizando a mesma estrategia dos programadores de Python, mas com uma convenção própria. Efetivamente tudo é publico por definição. 

 

Obviamente ainda é cedo pra dizer que public e private são conceitos em desuso mas há uma tendência de usá-los menos e isso só vai tomar forma em 5-10 anos, ou não.

 

47 minutos atrás, arfneto disse:

reinava com FORTRAN nas empresas e academia

 

Por sinal, Fortran AINDA reina na academia. Nos últimos dois anos trabalhei num projeto (física atômica e molecular) essencialmente em C++ e, ainda assim, escrevemos pelo menos umas 50 linhas de Fortran por dia. O velho Fortran anda mais vivo do que nunca com todo tipo de conceitos modernos. Vida longa a Fortran e LISP. :D 

 

Edit: Por sinal, Fortran anda tão vivo, que até mesmo nos cursos superiores aqui fora (moro no exterior) C++ tem sido gradativamente substituído por Python e... pasmem, Fortran continua nas grades curriculares!

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

1 hora atrás, V!OLADOR disse:

Bom, a afirmação correta deveria ser: essa convenção nada teria a ver com C e C++. Apenas começa a ter. Como expliquei acima, e por influência de Python (a maioria dos programadores desses novos projetos tiveram um ensino formal em Python)

 

:( Na verdade tem tudo a ver com C++ por aquela razão que te falei: em C++ e java é uma maneira de diferenciar as variáveis da classe das variáveis da função no código. Em C como não tem código na struct e não tem with tem que prefixar sempre as variáveis membro.

 

Sobre essas linguagens dos velhos tempos... Ainda há COBOL para todo lado. E muito graças ao Delphi Pascal ainda tem largo uso...

 

 

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...