2015-07-21 4 views
3

Это самая запутанная часть для меня из раздела Глобальные переменные и свойства сцепления.Как C++ различает вызов глобальной переменной и объявление глобальной переменной?

extern int g_var1; 

Утверждение может быть чем-то вроде этого при определении внешней неконсольной глобальной переменной. Я думаю, что я буду писать точно так же, как использовать эту переменную (через форвардную декларацию) в другом файле. Если оба утверждения одинаковы, то как C++ знает, была ли указана или определена ли переменная в файле?

+0

Непонятно, что вы подразумеваете под «вызовом переменной». –

+0

Это, кажется, ответ на ваш вопрос: http://stackoverflow.com/questions/10422034/when-to-use-extern-in-c – Jordan

+0

Вы не «вызов» переменные, вы звоните * функции * ,Похоже, вы действительно задаетесь вопросом, как компилятор определяет, является ли это определение глобальной или только декларации. – molbdnilo

ответ

1

Когда вы говорите extern int g_var1;, переменная просто объявлена, а позже, когда вы ее используете, вы можете использовать ее напрямую.

file1.cpp:

int g_var1; 

File2.cpp:

extern int g_var1; 

Вам не нужно писать extern каждый раз. Хотя я бы предложил, если вам нужно использовать глобальные переменные, поместите их в отдельный файл заголовка.

+0

Нишант Я полностью согласен с тобой. Но подумайте о случае, когда новичок (например, я) использует ключевое слово «extern» для определения глобальной переменной. Компилятор никогда не рассматривает его как ошибку. Что тогда? –

+0

Вы хотите сказать что-то вроде этого? extern int g_var1 = 0; Обратите внимание, что это поможет вам. http://stackoverflow.com/questions/17090354/why-does-initializing-of-an-extern-variable-locally-inside-a-function-give-an-er – Nishant

+0

Да ... но поскольку это не- const, инициализация не обязательна. –

3

Если я правильно понял ваш вопрос, вы не должны писать точно так же в другом файле (а именно, вы не должны писать «extern int g_var1» в двух файлах). Хорошей практикой является объявление некоторой переменной global в файле заголовка; сделайте определение в файле cpp, который включает этот заголовочный файл. После этого вы можете использовать эту переменную во всех файлах, которые будут включать заголовочный файл.

Для иллюстрации, примером может быть что-то вроде этого:

variables.hpp

#pragma once 
extern int g_var1; 

variables.cpp

#include "variables.h" 

int g_var1 = 1; 

main.cpp

#include "variables.h" 
#include <iostream> 

using namespace std; 

int main(){ 
    cout << g_var1 << endl; 
} 
2

утверждение f orm

extern int g_var1; // this is a declaration 

- это объявление переменной. Ключевое слово extern гарантирует это. Если вы пишете

int g_var1; // declare and define variable 

вы определяете его. Вы можете объявить переменную столько раз, сколько хотите, но определите ее только один раз. Поэтому вы можете написать

extern int g_var1; 

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

+0

Да, вы правы. Определение глобальной переменной путем префикса ключевого слова extern является избыточным. Но мой вопрос касается случая, когда ключевое слово extern используется для определения и не объявления глобальной переменной. Определение этого метода является законным, потому что компилятор не вызывает никаких ошибок. –

+0

Что значит «для случая, когда ключевое слово extern используется для определения и не объявления переменной»? Ключевое слово extern делает утверждение выражением, а не определением. – jensa

+0

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