Объявление и доступ к глобальным объектам - PullRequest
0 голосов
/ 14 мая 2011

Хорошо известный метод для этого - объявить int globalVar = 0 и затем - где его использовать - extern int globalVar;, но это не сработало со мной для объектов из определенного пользователем класса!

Этопример того, что я сделал:

file1.cpp:

 #include "file2.h"  
class list { ....};  
 list * x ;       
//do something with x` 

file2.cpp:

class list;  
 extern list * x;  
//do something with x

и вот ошибка, которую я получаю:

error C2027: use of undefined type 'list'

если я удалю class list

error C2143: syntax error : missing ';' before '*' // in `extern list *x;`  
error C4430: missing type specifier - int assumed. Note: C++ does not support 
             default-int

спасибо за ответы, теперь это так:

#ifndef _ERRLIST_H_
#define _ERRLIST_H_
#include <queue>
#include <string>

struct errorStruct{
            int errLineNum;
            int errColNum ;
            char * errMessage;
    };
queue <errorStruct> errQueue; //error points here
class ErrList
{

public:
void pushError(int line,int col,char * message);
void popError();    
void printErrors();
int getSize();

};
#endif

но я получаю эту ошибку:

error C2143: syntax error : missing ';' before '<'

Ответы [ 4 ]

4 голосов
/ 14 мая 2011

extern следует использовать в заголовочном файле. Помещение extern list *x в заголовочный файл - это объявление всем исходным файлам, что существует глобальная переменная x и она объявлена ​​где-то еще. Если вы не придерживаетесь этого подхода и вместо этого пишете extern list *x в исходном файле (как @ Als's), то вы фактически скрываете объявление и не даете понять всем исходным файлам, что глобальная переменная x существует. Тогда что может случиться? Может случиться так, что позже вы создадите другой исходный файл file3.cpp, в котором вы можете ошибочно объявить глобальную переменную с именем x, что приведет к ошибке компоновщика.

Таким образом, решение состоит в том, чтобы сделать четкое объявление, и правильное место объявления - заголовочный файл - так же, как и все остальные объявления.

Таким образом, ваш код должен выглядеть так:

  • list.h:

    class list { ....};  
    extern list * x;//extern means the variable declaration is elsewhere
    
  • list.cpp:

    #include "list.h"
    
    list * x;   //alright, the variable declaration is here!
    
    //use x
    
  • file1.cpp

    #include "list.h"
    
    //use x - no need to write : extern list *x
    
  • file2.cpp

    #include "list.h"
    
    //use x  - no need to write : extern list *x
    

Что касается ошибки, связанной с queue, вы должны квалифицировать ее как пространство имен std, в котором она определена. Напишите это:

   std::queue <errorStruct> errQueue; 
 //^^^^^ mention the namespace

Аналогично, если вы используете string (для которого вы включили заголовочный файл), тогда напишите std::string.

1 голос
/ 14 мая 2011

Ваш file2.cpp должен включать заголовок, который имеет определение class list.

myList.h

class list { ....};  

file1.cpp

#include "myList.h"
list * x ; 

file2.cpp

#include "myList.h"
extern list * x;  
0 голосов
/ 14 мая 2011

ошибка C2143: синтаксическая ошибка: отсутствует ';'до '<' </p>

Это "std :: queue ", а не "queue ".

0 голосов
/ 14 мая 2011

Как и для любого класса, компилятор должен увидеть его определение перед использованием. Поместите определение списка в заголовок и включите его в класс, который использует список. Это не имеет ничего общего с глобальными объектами.

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