2015-11-03 5 views
-3

У меня есть struct, который я хочу заполнить в отдельном исходном файле, откуда я запускаю main. В заголовочном файле я включил extern, но когда я иду, чтобы определить переменную в исходном файле, она не работает.Внешние переменные C++

//This is a header file 
    struct example { 
     int data1; 
     float data2; 
     bool example; 
    } 

    extern example tmp; 

И затем в исходном файле:

example *tmp = new example; 

Я получаю ошибку "Expected unqualified-id". Почему это?

+0

Вы действительно огляделись вокруг? http://stackoverflow.com/questions/1433204/how-do-i-use-extern-to-share-variables-between-source-files-in-c здесь отвечает на это хорошо. Кроме того, я не понял: почему вы используете разные типы данных? (Ptr и var) – Lasoloz

+0

Я действительно осмотрелся и уже видел это. Однако это не помогает в этом конкретном случае. Я использую ptr, потому что, когда я этого не делаю, я получаю сообщение об ошибке: «нет жизнеспособного преобразования из примера» в пример ». Я упомянул об этом и в комментариях к ответу. –

ответ

1
  • Точка с запятой отсутствует после объявления структуры.
  • Тип в декларации extern и определении отличается: example vs example*.
+0

Извините, запятая была опечаткой. У меня есть запятая в моем коде. Я удалил звездочку, и теперь мой код читает: «example tmp = new example;» однако появляется ошибка, которая гласит: «нет жизнеспособного преобразования из« примера »в пример» –

+1

Это потому, что 'new' возвращает указатель на выделенную память! – CinCout

+1

@phantazein Предполагая комментарии, я должен спросить: знаете ли вы, как работают указатели и память? Если вы не знаете отлично, попробуйте еще раз - и это не обида, я не учился за один день, но я узнал. Вернемся к вашему вопросу: если вы создаете указатель extern, то это указатель extern, а не (простая) переменная. Итак, объявление «extern example tmp», а затем использование «example * tmp» неверно, потому что первое не является указателем. Создание «extern example tmp», тогда выделение неверно, так как tmp не является указателем. Это означает, что вам просто не нужно использовать новое ключевое слово или вы должны объявить указатель в .h. – Lasoloz