Não escrevo C ++ há anos e agora estou tentando voltar a usá-lo. Eu então deparei com isso e pensei em desistir:
typedef enum TokenType
{
blah1 = 0x00000000,
blah2 = 0X01000000,
blah3 = 0X02000000
} TokenType;
O que é isso? Por que a typedef
palavra - chave é usada aqui? Por que o nome TokenType
aparece duas vezes nesta declaração? Como a semântica é diferente disso:
enum TokenType
{
blah1 = 0x00000000,
blah2=0x01000000,
blah3=0x02000000
};
É uma herança C, em C, se você fizer:
você terá que usá-lo fazendo algo como:
Mas se você fizer isso:
Você poderá declarar:
Mas em C ++, você pode usar apenas a definição anterior e usá-la como se estivesse em um typedef C.
fonte
Você não precisa fazer isso. Em C (não C ++), era necessário o uso de enumeração Enumname para se referir a um elemento de dados do tipo enumerado. Para simplificá-lo, você pode digitá- lo em um único tipo de dados de nome.
funções permitidas que tomam um parâmetro da enum a serem definidas como
em vez de mais
Observe que o nome do nome do tipo não precisa ser igual ao nome da enumeração. O mesmo acontece com estruturas.
Em C ++, por outro lado, não é necessário, pois enumerações, classes e estruturas podem ser acessadas diretamente como tipos por seus nomes.
fonte
Em C, é bom estilo porque você pode alterar o tipo para algo além de uma enumeração.
No C ++, você pode definir o enum para que ele seja compilado como C ++ ou C.
fonte
In C++ you can *typedef* the enum so that it will compile as C++ or C.
? Você disse:In C++ you can define the enum so that it will compile as C++ or C.
Observe como eu mudei o seudefine
paratypedef
. Bem ... Suponhotypedef
ing está definindo.Ressaca de C.
fonte
Algumas pessoas dizem que C não tem namespaces, mas isso não é tecnicamente correto. Tem três:
enum
,union
estruct
)typedef enum { } XYZ;
declara uma enumeração anônima e importa-os para o namespace global com o nomeXYZ
.typedef enum ABC { } XYZ;
declara uma enum nomeadaABC
no espaço de nomes da tag e depois a importa no espaço de nomes global comoXYZ
.Algumas pessoas não querem se preocupar com os espaços para nome separados, digitando tudo. Outros nunca digitaram porque querem o espaço para nome.
fonte
Isso é meio velho, mas de qualquer maneira, espero que você aprecie o link que estou prestes a digitar, como apreciei quando o encontrei no início deste ano.
Aqui está . Devo citar a explicação que sempre está em minha mente quando preciso entender alguns typedefs desagradáveis:
Como muitas pessoas disseram anteriormente, não há necessidade de usar typedefs declarando enumerações em C ++ . Mas essa é a explicação da sintaxe do typedef! Espero que ajude (provavelmente não OP, pois já faz quase 10 anos, mas qualquer um que esteja lutando para entender esse tipo de coisa).
fonte
Em algumas guias de estilo de código C, diz-se que a versão typedef é preferida por "clareza" e "simplicidade". Eu discordo, porque o typedef ofusca a natureza real do objeto declarado. Na verdade, não uso typedefs porque, ao declarar uma variável C, quero esclarecer qual é realmente o objeto. Essa opção ajuda-me a lembrar mais rapidamente o que um pedaço de código antigo realmente faz e ajudará outras pessoas a manter o código no futuro.
fonte
A resposta real à pergunta "por que" (que é surpreendentemente ignorada pelas respostas existentes sobre essa pergunta antiga) é que essa
enum
declaração provavelmente está localizada em um arquivo de cabeçalho que se destina a ser compilável em conjunto como código C e C ++ (ou seja, incluídos nos arquivos de implementação C e C ++). A arte de escrever esses arquivos de cabeçalho depende da capacidade do autor de selecionar recursos de idioma que tenham o significado compatível adequado nos dois idiomas.fonte