Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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?
>
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 :)
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.
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
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?
Você provavelmente quer construir "structs opacas".
Quais usos fará do tipo Tipo
>
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?
Ó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". ;-)
>
Ó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 :)
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.