Pergunta

Digamos que uma função receba um ponteiro nulo como argumento, assim: int func(void *p);
Como podemos determinar ou adivinhar o tipo para o qual p está apontando?

Foi útil?

Solução

Em geral, você não pode. Em alguns casos, se houver uma garantia sobre o que P apontar, você poderá olhar para o conteúdo e depois desse endereço para descobrir. Geralmente, sua função deve saber o que está sendo aprovada, a menos que apenas passe.

Os argumentos de dados e funções em C são apenas um monte de bits agrupados. A menos que você use alguns desses bits para lhe dizer quais são os bits, não há uma maneira consistente de identificá -lo.

Outras dicas

Claro que você pode, e é fácil também.É C, faça o que quiser, como quiser.

Faça um sistema de tipos.Coloque tudo o que você passa em uma estrutura, transforme o primeiro ou dois bytes em um número mágico para determinar o que a estrutura contém além do número mágico.

Faça algumas funções para criar/obter/definir/destruir as "variáveis ​​digitadas".

Faça algumas outras funções para adicionar e registrar novos tipos em tempo de execução.

Crie algumas definições para facilitar a leitura e a digitação das estruturas.

Antes que você perceba, você terá um bom sistema de tipo proprietário que poderá usar em seus projetos, e ele sempre fará EXATAMENTE o que você deseja e precisa, porque VOCÊ o criou.

Você poderia enlouquecer e transformá-lo em um sistema totalmente orientado a objetos.Ou poupe o trabalho e use o trabalho de todas as outras pessoas que já enlouqueceram - http://en.wikipedia.org/wiki/GObject

Resposta curta - você não pode.

Em c não há informações de tempo de execução A menos que você forneça, mas olhe para o printf(3) Família e veja como é fácil atirar no pé com especificações de formato incompatíveis e tipo de argumento real.

O sistema de tipo é seu amigo. Use-o.

Fui confrontado com um problema semelhante e me vi ter que escrever um conjunto de instruções para um projeto de linguagem de programação. Eu enfrentei esse problema porque tinha uma variedade de dicas para funções para que as funções pudessem ser enumeradas e executadas em um loop (para itens como ajuda on -line e sintaxe etc.). Por exemplo:

struct List_Str  *(*InstructionSet[])(struct List_Str *ContextPrefix,struct List_Str *ContextSuffix)=
{

  AAVF,Add,AddEmotions,AddEmoDebug,AddScope,...

};

Agora você pode facilmente fazer o mesmo com char * em vez de struct list_str * e converter todos os dados em formato de string usando snprintf e Atoi e ATOF e outras funções de conversão. Se você fizer um:

man isalpha

Isso mostra muitas funções no ctype.h que podem dar idéias como determinar que tipo de dados é mantido dentro das strings.

O dobro de todos os tipos em formato "pegajoso" permite uma tremenda flexibilidade e regularidade, mas converter automaticamente os dados das cordas em números inteiros, carros alegóricos etc. é árduo, mas frutífero quando as rotinas são bibliotecas.

Se você pretende manter dados binários, não poderá usar strings, pois 0 chars podem estar dentro dos dados binários e isso confunde as funções strlen. Além disso, você não tem idéia da duração do que foi malloc'd uma vez que ele deixa o escopo, armazenando o comprimento dos dados dereferenciados antes que os dados sejam recomendados nos primeiros bytes de char *.

Uma última coisa, eu não recomendaria armazenar dados no void *, é muito vago. Eu recomendo o uso de char *, pois é um pouco mais específico, pode conter tudo o que o vazio * pode e o compilador avisará você de antemão se algo parecer suspeito.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top