как использовать ключевое слово extern в структуре - PullRequest
1 голос
/ 15 ноября 2010

Пожалуйста, помогите мне ~:)

Под кодом успешно на визуальной студии. но, под кодом не может соответствовать Linux, G ++.

Код ..

хиджры

struct Test { Test(); ~Test(); };

B.h

extern struct Test { Test(); ~Test(); };

a.cpp

#include "A.h"    
Test::Test()
{
    cout << "Construction" << endl;
}

Test::~Test()
{
    cout << "Destruction" << endl;
}

B.cpp

#include "B.h"
strcut A_Test : Test { A_Test(); ~A_Test(); };

Когда я компилировал код в Linux. Я получил ошибку под описанием.

«класс хранения может быть указан только для объектов и функций»

В чем проблема этого кода на Linux?

Спасибо, все, и, пожалуйста, поймите мой английский дурак.

Ответы [ 2 ]

4 голосов
/ 15 ноября 2010

Test - это тип данных, поэтому вам не нужно использовать extern. Как говорится в сообщении об ошибке, extern только для функций и объектов. Если Visual Studio позволяет компилировать ваш код, то это «ошибка» в компиляторе.

Смысл extern состоит в том, чтобы указывать компилятору не беспокоиться о функциях и объектах, которые он не может видеть, поскольку они были определены в другом месте (они будут разрешены компоновщиком). Это не имеет смысла для типов данных; компилятору необходимо , чтобы узнать тип данных, чтобы сгенерировать правильный объектный код.

0 голосов
/ 15 ноября 2010

Пример внешнего использования:

a.cpp

struct test myObj;

b.cpp

extern struct test myObj;

extern означает, что компилятор не будет ничего делать, он сделает этот символ неопределенным, он просто оставляет его компоновщику для выполнения остальной части работы, помните, что когда вы компилируете b.cpp, задайте опцию -c для gcc, -Опция c гарантирует, что код только скомпилирован и не связан, что-то вроде ниже

g ++ -c b.cpp / * это сгенерирует bo * /

и скомпилирует основной файл, как показано ниже

g ++ bo a.cpp

...