euMesmo2 0 Denunciar post Postado Outubro 18, 2012 Tenho o seguinte codigo: typedef struct tipo_t Tipo; #define SZ(type) strcmp("Tipo", #type) ? sizeof(type) : 10 ... printf("%d\n", SZ(Tipo)); Ao roda-lo esperava receber o valor 10, porém o compilador retorna o seguinte erro: error: invalid application of ‘sizeof’ to incomplete type ‘Tipo’ Parece que, mesmo nunca atingindo essa linha para essa condição, o compilador ainda assim precisa definir a função. Alguem sabe como contornar o problema? Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Outubro 18, 2012 Você precisa definir o tipo no typedef. Não tem como retornar o tamanho se não tem nenhum tipo de dado na struct. E ao invés de usar uma macro, eu deixaria como uma função. Compartilhar este post Link para o post Compartilhar em outros sites
euMesmo2 0 Denunciar post Postado Outubro 18, 2012 Você precisa definir o tipo no typedef. Não tem como retornar o tamanho se não tem nenhum tipo de dado na struct. Sim, sim. Enquanto ninguem respondia, pensei em usar: typedef struct tipo_t{} Tipo; #define SZ(type) strcmp("Tipo", #type) ? sizeof(type) : 10 ... printf("%d\n", SZ(Tipo)); Assim, a função sizeof para de dar pau. A constante 10 é só para testar mesmo. vou definir uma função no meu '.c' para retornar o tamanho verdadeiro de Tipo. Esse código todo, no caso esta em meu '.h'. Vou testar e posto o resultado aqui. E ao invés de usar uma macro, eu deixaria como uma função. Como função? Mas como você verifica se o parâmetro passado é do tipo "Tipo" se, em nível de execução, um programa em c não possui tabela de tipos? Sim, sim. Enquanto ninguem respondia, pensei em usar: typedef struct tipo_t{} Tipo; #define SZ(type) strcmp("Tipo", #type) ? sizeof(type) : 10 ... printf("%d\n", SZ(Tipo)); Funcionou!!! Obrigado pela ajuda :) Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Outubro 20, 2012 http://stackoverflow.com/questions/11254891/can-a-running-c-program-access-its-own-symbol-table Mas isso deve ser algo bem obscuro. Uma outra forma é criar um campo contendo o nome do tipo de dado. Mas aí você provavelmente precisa trabalhar com ponteiros, criando uma função que usa o padrão Factory (os mais entendidos de design patterns me corrijam), onde esse campo da struct vai ser definido. Nesse caso é fácil criar uma função type_of, is_instance ou outra coisa parecida. Compartilhar este post Link para o post Compartilhar em outros sites
guidjos 65 Denunciar post Postado Outubro 20, 2012 Bem vindo ao fórum. Primeiro, algumas observações: 1. sizeof não é uma função. É um operador unário. 2. A string de formato do tipo da aplicação de sizeof é %zu. Veja: #include <stdio.h> int main(void) { printf("%zu == 10 * %zu\n", sizeof (int [10]) { 0 }, sizeof (int)); int a[10] = { 0 }; printf("%zu == 10 * %zu\n", sizeof a, sizeof *a); } Dito isto, qual problema está tentando resolver usando a definição que deu? O tamanho não é a única característica que determina um tipo. Representação é importante. Sugiro que leia pelo menos o quarto parágrafo deste texto: http://guipn.com/tac.htm#3 Compartilhar este post Link para o post Compartilhar em outros sites
euMesmo2 0 Denunciar post Postado Outubro 23, 2012 Bom, na verdade o que estou fazendo é representar um tipo abstrato de dados através de "Tipo", mas não quero que o conteudo da estrutura seja "visivel" fora do arquivo fonte que manuseia este tipo de dados, fazendo das funções que defini a única forma de manusear estes dados. Em todos os casos devera-se trabalhar com o ponyeiro para Tipo ou seja: Tipo*. A alocação de uma nova variavel, destruição, e tudo mais será tratado no meu arquivo "tipo.c". ja em "tipo.h" devera conter somente prototipos. Se o que estou fazendo não é recomendade, então qual seria uma forma melhor de faze-lo? Compartilhar este post Link para o post Compartilhar em outros sites
guidjos 65 Denunciar post Postado Outubro 23, 2012 Você provavelmente quer construir "structs opacas". Quais usos fará do tipo Tipo Compartilhar este post Link para o post Compartilhar em outros sites
euMesmo2 0 Denunciar post Postado Outubro 24, 2012 Você provavelmente quer construir "structs opacas". Quais usos fará do tipo Tipo Bom, pesquisei um pouco na Wikipedia e parece ser exatamente o que estou fazendo. Estou tentando declarar uma struct opaca. E originamelte era o que estava fazendo quando criei este post, mas estava tendo problemas ao utilizar "sizeof". Meu código agora roda perfeitamente. Minha pergunta agora é: Há algo de errado no que estou fazendo agora? Existe um meio melhor ou mais recomendado? Compartilhar este post Link para o post Compartilhar em outros sites
guidjos 65 Denunciar post Postado Outubro 25, 2012 Ótimo. Pra saber se existe algo melhor para fazer o que está tentando, vale novamente a pergunta: que usos fará do tipo Tipo? E também é preciso definir "bom". ;-) Compartilhar este post Link para o post Compartilhar em outros sites
euMesmo2 0 Denunciar post Postado Outubro 26, 2012 Ótimo. Pra saber se existe algo melhor para fazer o que está tentando, vale novamente a pergunta: que usos fará do tipo Tipo? E também é preciso definir "bom". ;-) Os usos são os que fale: Tipo serve apenas para mascarar um outro tipo contido num arquivo fonte. Servirá somente para ser passado como parametro para funções. Porém, para uma delas, precisarei passar como argumento o sizeof da variavel. Dai minha duvida. Mas creio que agora esteja tudo resolvido :) Compartilhar este post Link para o post Compartilhar em outros sites