Как объявить глобальную переменную?

Тема в разделе "WASM.BEGINNERS", создана пользователем intel_x128, 7 июн 2009.

  1. intel_x128

    intel_x128 New Member

    Публикаций:
    0
    Регистрация:
    17 май 2009
    Сообщения:
    345
    есть 2 cpp файла. Нужно объявить глобальную пременную, чтобы ее можно было видеть из всех спп файлов
    Вопрос - как?
     
  2. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    Научитесь пользоваться гуглом - очень полезно.
    http://www.cplusplus.com/doc/tutorial/variables/
     
  3. intel_x128

    intel_x128 New Member

    Публикаций:
    0
    Регистрация:
    17 май 2009
    Сообщения:
    345
    Очень извиняюсь.
    Перечитал 2 раза
    Так и не понял, где там рассказывается, как объявить глобальную в одном спп-файле, чтобы ее можно было использовать в другом.
     
  4. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    intel_x128
    в простейшем случае, например так:
    Код (Text):
    1. // a.cpp
    2. int a;
    Код (Text):
    1. // b.cpp
    2. extert int a;
    Однако чаще делают не так, а вот как:
    Код (Text):
    1. // a.h
    2. #pragma once
    3.  
    4. extern int a; // здесь объявление
    Код (Text):
    1. // a.cpp
    2. #include "a.h"
    3.  
    4. int a; // здесь определение
    Код (Text):
    1. #include "a.h"
    2.  
    3. void f()
    4. {
    5.     a = 1; // здесь используем
    6. }
    Так строже и безопаснее для разработчика.
    Кстати, глобальные переменные, тем более с внешним связыванием - это вообще-то дурной тон в большинстве случаев. Особенно в цепепе.
     
  5. intel_x128

    intel_x128 New Member

    Публикаций:
    0
    Регистрация:
    17 май 2009
    Сообщения:
    345
    Ustus
    Спасибо оргомное! То, что нужно! работает! )))))))
     
  6. rdtsc

    rdtsc Параллелепипедов Артем

    Публикаций:
    0
    Регистрация:
    10 мар 2009
    Сообщения:
    180
    Адрес:
    Москва
    Керниган,Ричи -Книжка по Языку С
     
  7. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    rdtsc
    Вопрос был про C++. В C не так.
     
  8. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    Ustus
    А как интересно?
     
  9. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    И что же там интересно "не так"?
     
  10. reversecode

    reversecode Guest

    Публикаций:
    0
    наверное идентификатор ставят extern "C"
    токо то если сразу с двух проектов и в C и в C++
    а у него в рамках одного
     
  11. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    r90
    cppasm
    В Си глобальные переменные по умолчанию имеют внутреннее связывание. В си-плюсплюс - наоборот, внешнее. И то и другое, разумеется, если квалификатор не задан явно. Хотя в Си я особо не силен, возможно в C99 уже по-другому, но в стандарте K&R именно так. Поэтому в Си приведенный пример работать не будет, надо явно дописывать extern.
     
  12. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    Это у меня с памятью проблемы? Мне что-то кажется, что из твоего примера на K&R не отработает лишь одна строчка -- это не подпадающий ни под какой из стандартов #pragma once. То что это отработало бы в любом из компиляторов C с которыми я сталкивался -- это точно абсолютно.
    На работе буду, загляну в K&R. У меня нету дома. Но я не думаю, что там иначе.
     
  13. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Ustus
    вы наркоман?
     
  14. nop_

    nop_ New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2007
    Сообщения:
    61
    '#pragma once' - вполне законная директива препроцессора (16.6/1). Все что находится после '#pragma' трактуется как 'implementation-defined', и в принципе для разных компиляторов это может означать разные вещи. Хотя гарантируется, что если компилятор не распознал оставшуюся часть ('once'), то она будет проигнорирована.
     
  15. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Нет.
    Даже в С89 связывание у них внешнее.
    Для внутреннего надо static добавить.
    Твой пример - это и есть Си, если не считать что в комментариях имя модуля написано a.cpp :)
    Это всего лишь говорит компилятору не манглить имена.
     
  16. RedLord

    RedLord Member

    Публикаций:
    0
    Регистрация:
    23 июн 2005
    Сообщения:
    183
    Адрес:
    Ukraine
    cppasm
    это неверно.

    возмем две единицы трансляции A и B

    A.cpp
    int x;

    B.cpp

    int x;


    переменные действительно имеют внешнее связывание и в данном случае будет нарушено ODR.
    поэтому в одной из единиц нужно будет
    написать так
    extern int x;
     
  17. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    А почему вы спрашиваете?
     
  18. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    cppasm
    Ну, это легко проверить... Второй пример будет работать всегда, потому что там extern задается явно. А вот первый в си работать вроде как не должен. Еще раз ИМХО, т.к. си я знаю значительно хуже плюс-плюса.
     
  19. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Ustus
    По-моему первый вариант не будет работать и в C++, ибо нет ключевого слова extert.
    Но если его поменять на extern, то первый вариант как раз описан в моей нубской книжке по Си.
     
  20. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    И кстати первый вариант по-моему лучше, так как не захламляет пространство имён везде где включён заголовочный файл.