Warnings ponteiro para struct

Programação C em geral

Moderadores: 51, guest2003

Warnings ponteiro para struct

Mensagempor RobL » 31 Jul 2014 23:14

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)?
RobL
Dword
 
Mensagens: 1546
Registrado em: 20 Fev 2007 17:56

Re: Warnings ponteiro para struct

Mensagempor cfreund » 01 Ago 2014 01:22

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;
}
Cláudio F
Avatar do usuário
cfreund
Word
 
Mensagens: 672
Registrado em: 14 Out 2006 14:02
Localização: São Paulo

Re: Warnings ponteiro para struct

Mensagempor RobL » 01 Ago 2014 07:49

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 ?
RobL
Dword
 
Mensagens: 1546
Registrado em: 20 Fev 2007 17:56

Re: Warnings ponteiro para struct

Mensagempor Djalma Toledo Rodrigues » 01 Ago 2014 09:51

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
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Re: Warnings ponteiro para struct

Mensagempor RobL » 01 Ago 2014 19:06

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.
RobL
Dword
 
Mensagens: 1546
Registrado em: 20 Fev 2007 17:56


Voltar para Visual C++/C/C++/C#

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x