Как бороться с illegal storage class ?
От: Valеntin  
Дата: 10.02.06 14:47
Оценка:
Здравствуйте, господа программисты. Никак не могу понять из-за чего компилятор выдает ошибку " illegal storage class".
Опишу в кратце ситуацию. Есть класс, который представляет БД, он должен быть всегда доступен другим различным классам. Причем всегда используется его единственный экземпляр, который создается при запуске программы. Исходя из таких соображений я объявляю экземпляр класса через extern в том же хидере, а в cpp файле с реализацией этого класса объявляю реальную переменную CWUnit *dbUn=0; В программе имеются другие классы схожего назначения и использующиеся таким же образом, но для них ошибка не выдается.

class CWUnit : public CExpertDatabase {
    public:
        CWUnit();    
        //коды полей даты 
        int GROUP_ID_Index;
        int ID_Index;
        int NAME_Index;
        int BASE_Index;
        int COEFF_Index;

        int getGroupID(const int index) {return atoi(fastGetFieldPtr(GROUP_ID_Index,index));}
        int getID(const int index) {return atoi(fastGetFieldPtr(ID_Index,index));}
        const char *getName(const int index) {return fastGetFieldPtr(NAME_Index,index);}
        int getBase(const int index) {return atoi(fastGetFieldPtr(BASE_Index,index));}
        float getCoeff(const int index) {return atof(fastGetFieldPtr(COEFF_Index,index));}

        int getGroupID() {return getGroupID(recNo());}
        int getID() {return getID(recNo());}
        const char *getName() {return getName(recNo());}
        int getBase() {return getBase(recNo());}
        float getCoeff() {return getCoeff(recNo());}
        
        sUnitInfo getUnitInfo(int group_id, int unit_id);
        CUnitList getUnitList(int group_id);
        int getCoeffByCode(CWareDB *db, int ware_code, int unit_id);
        
    private:
        void getIndexes();
        sUnitInfo getUnit();
};

extern CWUnit * dbUn;//здесь выдает ошибку

Хелп говорит по этому поводу следующее:

C/C++ Error 10078

illegal storage class

The compiler issues this error when an illegal storage class is used. This error is also generated when variables in a global scope are declared as auto (shown below).

auto int x;//error: auto is not allowed in global scope

Fix

Use a legal storage class.

static int x;
Пишу в CodeWarrior v5.2

Как быть?


Добавлено форматирование — Кодт
Re: Как бороться с illegal storage class ?
От: BitField Украина http://lazy-bitfield.blogspot.com
Дата: 11.02.06 09:33
Оценка:
Здравствуйте, Valеntin, Вы писали:

V>Здравствуйте, господа программисты. Никак не могу понять из-за чего компилятор выдает ошибку " illegal storage class".

V>Опишу в кратце ситуацию. Есть класс, который представляет БД, он должен быть всегда доступен другим различным классам. Причем всегда используется его единственный экземпляр, который создается при запуске программы. Исходя из таких соображений я объявляю экземпляр класса через extern в том же хидере, а в cpp файле с реализацией этого класса объявляю реальную переменную CWUnit *dbUn=0; В программе имеются другие классы схожего назначения и использующиеся таким же образом, но для них ошибка не выдается.

V>
V>class CWUnit : public CExpertDatabase {
V>    public:
V>        CWUnit();    
V>        //коды полей даты 
V>        int GROUP_ID_Index;
V>        int ID_Index;
V>        int NAME_Index;
V>        int BASE_Index;
V>        int COEFF_Index;

V>        int getGroupID(const int index) {return atoi(fastGetFieldPtr(GROUP_ID_Index,index));}
V>        int getID(const int index) {return atoi(fastGetFieldPtr(ID_Index,index));}
V>        const char *getName(const int index) {return fastGetFieldPtr(NAME_Index,index);}
V>        int getBase(const int index) {return atoi(fastGetFieldPtr(BASE_Index,index));}
V>        float getCoeff(const int index) {return atof(fastGetFieldPtr(COEFF_Index,index));}

V>        int getGroupID() {return getGroupID(recNo());}
V>        int getID() {return getID(recNo());}
V>        const char *getName() {return getName(recNo());}
V>        int getBase() {return getBase(recNo());}
V>        float getCoeff() {return getCoeff(recNo());}
        
V>        sUnitInfo getUnitInfo(int group_id, int unit_id);
V>        CUnitList getUnitList(int group_id);
V>        int getCoeffByCode(CWareDB *db, int ware_code, int unit_id);
        
V>    private:
V>        void getIndexes();
V>        sUnitInfo getUnit();
V>};

V>extern CWUnit * dbUn;//здесь выдает ошибку  
V>


кодвориора нет под рукой, так что варианты наугад

1) где-то определен макрос extern -- вставь проверку типа
#ifdef extern
#error
#endif


2) Замени глобальную переменную на синглетон (Если у тебя только одна глобальная переменная этого типа). Если не знаешь, что это такое -- Поиск по сайту/в статьях. Советую посмотреть на синглетон Маерса, тот, где:

static Class & getInstance() 
{
  static Class instance;
  return instance;
}
Re[2]: Как бороться с illegal storage class ?
От: Valеntin  
Дата: 14.02.06 16:37
Оценка:
Здравствуйте, BitField, Вы писали:
BF>кодвориора нет под рукой, так что варианты наугад

BF>1) где-то определен макрос extern -- вставь проверку типа

BF>
BF>#ifdef extern
BF>#error
BF>#endif
BF>


BF>2) Замени глобальную переменную на синглетон (Если у тебя только одна глобальная переменная этого типа). Если не знаешь, что это такое -- Поиск по сайту/в статьях. Советую посмотреть на синглетон Маерса, тот, где:


BF>
BF>static Class & getInstance() 
BF>{
BF>  static Class instance;
BF>  return instance;
BF>}
BF>


Спасибо! Разобрался. Причина была в том, что по оплошности в одном из классов использующих данный класс, инклуд на файл был вставлен прямо перед методом который работает с объектами такого класса, а не в начале файле.

class OtherClass {
public:
void method1();
include "CWUnit.h"
void method2(CWUnit &unit);
};
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.