что вы можете инициализировать глобальные переменные в C ++ - PullRequest
2 голосов
/ 01 мая 2011

Можете ли вы инициализировать глобальные переменные в c ++ и, если возможно, какие значения допустимы?

Ответы [ 4 ]

5 голосов
/ 01 мая 2011

Допустимые значения зависят от типа переменной.Для int хорошо 0 или 42.Для string «привет мир» работает.Инициализация глобальных переменных идентична инициализации других переменных, поэтому вы можете свободно использовать то, что можете использовать.

Обычно лучше сохранить простоту;если вам нужен сложный инициализатор для глобальной переменной, переменная может быть не в том месте, но вы можете сделать совсем немного, если это необходимо.

Синтаксис для этого, в самом основном, это:

int global_Int = 42;
string global_String = "Hello World";

Однако, если это делается в заголовке (поскольку глобальные переменные обычно объявляются в общем заголовке), вы получите дублированные объявления и ошибки.Чтобы решить эту проблему, используйте ключевое слово extern для их объявления, а затем инициализируйте в файле кода:

Заголовок:

extern int global_Int;
extern string global_String;

Код:

#include "header.hpp"

int global_Int = 42;
string global_String = "Hello World";

Затем просто включайте заголовок всякий раз, когда вам нужно использовать переменные.При необходимости вы также можете добавить другие ключевые слова (например, если вам нужны const globals).

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

Да, конечно, вы можете инициализировать глобальные переменные. Для встроенных типов вы можете использовать любое значение, которое вы можете использовать для назначения (и вы также можете инициализировать массивы, которые вы не можете назначить). Для типа класса вам решать, какие типы / значения будут разрешены (и / или требуются) при разработке класса. Для предопределенного класса, вы в основном должны обратиться к документации, чтобы выяснить, что он разрешает / требует.

В конечном счете, однако, тот факт, что это глобальное значение, не влияет на значения, которые могут быть предоставлены. Хотя глобальность может повлиять на то, как вы можете получить значение - в частности, вы, очевидно, не можете использовать значения, которые еще не доступны, когда эта инициализация завершена. Это может быть немного более тонким, чем кажется на первый взгляд, потому что очень мало гарантировано порядка, в котором глобальные переменные инициализируются по сравнению друг с другом, например (например), когда выполняется конструктор для вашей глобальной переменной, std::cin, std::cout и std::cerr, возможно, еще не были созданы, поэтому, если вы хотите инициализировать что-либо на основе ввода от пользователя, вам, возможно, придется предпринять специальные шаги, чтобы либо обеспечить порядок инициализации, либо иначе (например) использовать стиль C Ввод / вывод для этой конкретной работы.

3 голосов
/ 01 мая 2011

Конечно, мы можем. Почему мы не можем?

//global variables
int g_int = 100;
int g_float = 10.0;
int g_char = 'A';

class X 
{
   int value;
   public:
      X(int v) : value(v){}
};

X g_x1(10);  //initialize with argument 10
X g_x2 = X(198); //with arg 198

int main()
{
}
1 голос
/ 01 мая 2011

Может быть что угодно, как в вызове конструктора:

static const std::string boo( "42" );

Будьте осторожны - они запускаются до main(), но их порядок не определен (см. "фиаско статического порядка инициализации" ).

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