предупреждение во внешней декларации - PullRequest
11 голосов
/ 24 ноября 2010
#include<stdio.h>
#include<stdlib.h>
#define GREY 1
#define BLACK 0
#define WHITE 2
typedef struct node * graph;
typedef struct stack * snode;

graph cnode(int data);          //cnode is to create a node for graph
void cgraph(void);
struct node {
        int data, color;
        struct node *LEFT, *RIGHT, *TOP, *DOWN;
};//this structure defines a node of the graph

struct stack {
struct stack *priv;
struct cgraph *graph_node;
};// this is to define a structure which should hold node of a structure

    extern snode sroot;

Я определил файл заголовка (объявление.h), как указано выше, и ниже я делаю программу переменного тока (stack.c), которая будет использоваться в библиотеке, которую я разрабатываю

#include<declarations.h>
void cstack (graph temp);
void stackpush(snode stemp);
extern int stack_counter = 0;

sroot=NULL;
void cstack (graph gtemp) //cstack is to create stack
{
   snode spriv,some;
  if (stack_counter==0)
  {
   sroot=stackpush(gtemp);
    spriv=sroot;
   stack_counter++;
   }
   else{
   some=cstacknode(gtemp);
    some->priv=spriv;
    spriv=some;
  }

}

//struct stack is representing a stack
//struct node is representing a node in graph

snode  cstacknode (graph gtemp)
//this function should create a node of the stack which should be storing the graph node as a pointer
{
 snode an;
 an=(snode)malloc(sizeof(snode));
 an->graph_node=gtemp;
 an->priv=NULL;
 return an;
}

void stackpush(snode stemp)
{

}

оба вышеуказанных файла находятся в одном каталоге.Я скомпилировал вышеуказанный файл stack.c cc -I ./ stack.c I, следуя предупреждениям

stack.c:4: warning: ‘stack_counter’ initialized and declared ‘extern’
stack.c:6: warning: data definition has no type or storage class
stack.c:6: error: conflicting types for ‘sroot’
./declarations.h:21: note: previous declaration of ‘sroot’ was here
stack.c:6: warning: initialization makes integer from pointer without a cast
stack.c: In function ‘cstack’:
stack.c:12: warning: passing argument 1 of ‘stackpush’ from incompatible pointer type
stack.c:3: note: expected ‘snode’ but argument is of type ‘graph’
stack.c:12: error: void value not ignored as it ought to be
stack.c:13: warning: assignment makes pointer from integer without a cast
stack.c:17: warning: assignment makes pointer from integer without a cast
stack.c: At top level:
stack.c:27: error: conflicting types for ‘cstacknode’
stack.c:17: note: previous implicit declaration of ‘cstacknode’ was here
stack.c: In function ‘cstacknode’:
stack.c:32: warning: assignment from incompatible pointer type

Я хочу знать, когда я объявил переменную как extern, которую я выделил жирным шрифтом, почему я получаю это как предупреждение о любых мыслях очто, и если кто-то захочет поделиться какой-либо другой информацией об оставшихся ошибках, дайте мне знать.

Ответы [ 2 ]

32 голосов
/ 05 февраля 2014

Хотя ваш код содержит ряд довольно серьезных и очевидных ошибок (уже рассмотренных в других ответах), предупреждение, которое вы вводите в заголовок вашего вопроса, является совершенно лишним бессмысленным предупреждением.Компилятор GCC известен тем, что выдает бесполезные предупреждения.Многие из этих предупреждений, похоже, происходят от чьей-то некомпетентной и совершенно необоснованной веры в то, что что-то делать как-то «неправильно», хотя в действительности в этом нет ничего плохого.

В вашем случае предупреждение вызывается

extern int stack_counter = 0;

декларация.По-видимому, «автор» предупреждения полагал, что спецификатор extern должен быть зарезервирован для неопределяемых объявлений.В этом случае наличие инициализатора = 0 превращает объявление в определение (и, таким образом, формально делает это extern необязательным).Тем не менее, в этом нет ошибки, и, на самом деле, extern было бы весьма кстати, чтобы подчеркнуть тот факт, что stack_counter предназначен для глобальной переменной.

Опять же, нужна ли вам глобальная переменнаяЗдесь или нет другой вопрос, и, опять же, ваш код содержит огромное количество других ошибок.Но предупреждение, на котором вы, кажется, сосредоточили свое внимание, не стоит того.Просто отключите это предупреждение в настройках компилятора (и, пожалуйста, напишите грубое письмо об этом команде GCC).

5 голосов
/ 24 ноября 2010

Объявление extern в вашем заголовочном файле позволяет использовать модули, отличные от того, в котором определена переменная. Если он должен быть определен как int stack_counter = 0 и находится в stack.c, определите его таким образом и поместите extern stack_counter в заголовок.

В строке 6 файла stack.c вы не определили класс хранения для sroot. Так как в заголовке он внешний, я предполагаю, что вы хотели набрать snode sroot=NULL.

Исправьте их, затем реализуйте stackpush (убедитесь, что он не возвращает void) и разберитесь с остальными вашими предупреждениями по порядку. Обратите внимание, что в C вы должны либо использовать предварительные объявления функций (с прототипами), либо определять свои функции перед их использованием. Функция cstack, вероятно, должна быть последней функцией в файле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...