Página 1 de 1

Warnings ponteiro para struct

MensagemEnviado: 31 Jul 2014 23:14
por RobL
Compilador GCC (AVR-GCC cross compiler)

Já há certo tempo conheço a solução para os warnings, mas não sei explicar.
Peço-lhes o por que.
Descrição do problema:
Declarando e definindo uma struct como abaixo, uso a struct de nome teste em qualquer arquivo sem erro ou warnings.

Por que os warnings quando defino um ponteiro para struct como
parâmetro de uma função ?

Isto ocorre em um arquivo onde a struct não foi definida
mas tem o header de sua declaração incluído neste arquivo
conforme descrito a seguir:


//Declaro uma struct em um header
//arquivo main.h

struct Hor
{
int num;
};

extern struct Hor teste; // tornando-a visível em outros arquivos

//arquivo main.c

struct Hor teste ; // definição da struct teste


//arquivo novo.c

#include "novo.h" // onde esta o prototipo da func foo()
#include "main.h" // onde esta declarada a struct Hor

foo(&teste); // chama a func definida abaixo

void foo (struct Hor *ptr_str) // parâmetro, ponteiro para struct
{
ptr_str->nun = 1; // fazer qualquer coisa, por exemplo
}


//arquivo novo.h

void foo (struct Hor *); // prototipo da func

Apos compilar, da os warnings abaixo :

Warning 1'struct Hor' declared inside parameter list [enabled by default]

Warning 2 its scope is only this definition or declaration, which is probably not what you want [enabled by default]

Se colocar no arquivo novo.h

struct Hor; //ou struct Hor teste, compila sem warnings !!!

Por que o compilador aceita "struct Hor" ou "struct Hor teste"
quando colocada no arquivo hovo.h ?
O que significa: struct Hor ??!!! Uma redefinacao vazia ?

Como devo definir esse ponteiro para funcao no arquivo novo.c ?

Se a func foo for colocada no arquivo main.c onde a struct foi definida, compila sem warnings.
Por que o problema com o ponteiro para struct como parâmetro da
função, visto que a struct é visível em qualquer arquivo inclusive
no arquivo novo.c (onde testo qualquer operação com o seu membro)?

Re: Warnings ponteiro para struct

MensagemEnviado: 01 Ago 2014 01:22
por cfreund
Experimente:

main.h:
Código: Selecionar todos
#ifndef MAIN_H
#define MAIN_H

typedef struct
{
   int num;
} HOR;

extern HOR hor;

void foo(HOR *p_hor);

#endif


main.c:
Código: Selecionar todos
#include "main.h"

HOR hor;

void main()
{
   hor.num = 0;
   foo(&hor);
}


Teste.c:
Código: Selecionar todos
#include "main.h"

void foo(HOR *p_hor)
{
   p_hor->num = 0xFFFF;
}

Re: Warnings ponteiro para struct

MensagemEnviado: 01 Ago 2014 07:49
por RobL
Cláudio, muito obrigado por colaborar com meu aprendizado.

Percebi no seu exemplo que o protótipo da função foi colocado no main.h onde a struct foi declarada.
Sem usar typedef, mantendo meu código, desloquei o protótipo para o main.h e compilou sem warnings.
Fica a pergunta: Isto é uma "regra" a seguir em C, para este caso ?

Re: Warnings ponteiro para struct

MensagemEnviado: 01 Ago 2014 09:51
por Djalma Toledo Rodrigues
Ponteiro é um endereço de memória, logo essa posição de memória há que esta preservada

É próprio do C essa sintaxe idiota
pois os Mnemônicos Intel (Assembler) foram patenteados

Dj

Re: Warnings ponteiro para struct

MensagemEnviado: 01 Ago 2014 19:06
por RobL
Olá Djalma. Obrigado pela resposta.
O problema está no porque da falta de visibilidade da struct quando definido um ponteiro para a struct como parãmetro de função, nas condições descritas.
Abraços.