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)?