Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

euMesmo2

Problema envolvendo macros

Recommended Posts

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

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

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

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

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

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

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

Ó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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.