Использование ключевого слова extern в C++

Из того, что я собрал, ключевое слово «extern» в С++ можно использовать, чтобы сообщить компилятору, что переменная определена в другом файле .cpp. Мне было интересно, должно ли это определение быть явным или определение может быть изменено с помощью побочного эффекта с помощью функции в файле .cpp, где определена переменная.

i.e.

//a.h
extern int foo;

//a.cpp
#include <a.h>

int foo=0;
int func(int &foo) // EDIT: oops, forgot the type for the parameter and return statement
{
foo = 10;
return 5;
}
int x = func(foo); // EDIT: changed to match declaration and assigned function to dummy variable

//b.cpp
#include <a.h>

int main()
{
cout << foo;
return 0;
}

Может ли программа распознать, что foo должно быть равно 10 или будет равно 0? И если компилятор распознает foo как 0, могу ли я сделать так, чтобы он распознавал его как 10? Кроме того, причина, по которой я не могу просто скомпилировать и протестировать это самостоятельно, заключается в том, что я не уверен, как скомпилировать, когда есть несколько файлов, я новичок =).

РЕДАКТИРОВАТЬ: Спасибо за указатели ошибок, но я думаю, что главный вопрос по-прежнему заключается в том, может ли b.cpp видеть, равен ли foo 10 или 0. Ура!


person Roger Wang    schedule 02.07.2013    source источник
comment
У вас какая-то странность происходит с двумя основными функциями. Вам нужен только один, и эта основная функция может вызывать функции из b.cpp, даже если он находится в a.cpp. Вот что делает #includes. Кроме того, вашему func() не нужен аргумент &foo для работы. Я доберусь до своего компьютера и опубликую ответ в ближайшее время. О, и компиляция их вместе зависит от вашей IDE/компилятора. Что у тебя есть?   -  person BrainSteel    schedule 02.07.2013
comment
@Александру Нет, это не так! @Roger Что должно означать &foo в int func(&foo) { ... }?   -  person Praetorian    schedule 02.07.2013
comment
@Praetorian, мой плохой, был невнимателен к тому, что это разные файлы.   -  person Alexandru Barbarosie    schedule 02.07.2013
comment
@Praetorian это был просто способ представить функцию/процедуру, которая изменяет переменную по ссылке, а также возвращает что-то еще. Кажется, это называется побочным эффектом. Я хочу знать, может ли другая функция распознать переменную во включаемом файле, если она не была явно определена или изменена.   -  person Roger Wang    schedule 02.07.2013
comment
@BrainSteel g++ и gcc   -  person Roger Wang    schedule 02.07.2013
comment
@RogerWang Это все хорошо знать, но вы изобретаете свою собственную грамматику, пытаясь достичь того, чего хотите. Если вы хотите взять ссылку на int и вернуть int, сигнатура функции должна быть int func(int&), а функции нужен оператор return. Пожалуйста, начните читать книгу.   -  person Praetorian    schedule 02.07.2013
comment
@Praetorian, верно, извините. Я торопился напечатать пример того, что пытался сделать, и сделал много синтаксических ошибок. Я предполагаю, что переменная foo является важной, определение x было просто для вызова func.   -  person Roger Wang    schedule 03.07.2013


Ответы (2)


Должно быть 10.

Пояснение:

Во-первых, заявление

int x=func(foo);

будет вызываться перед входом в функцию main и после

int foo=0;

Во-вторых, foo в func будет скрывать глобальный foo, поэтому foo в func будет применяться только к входящему параметру по ссылке.

В-третьих, ваш код не будет скомпилирован. Причина 1: вы не используете заголовок из системы, поэтому вам нужно #include "header.h" вместо #include <header.h>. Причина 2: для cout необходимо #include <iostream> и написать std::cout, при условии, что вы не используете устаревшую ВК 6.0.

person xis    schedule 02.07.2013
comment
Спасибо за ответ, а также за объяснение! - person Roger Wang; 03.07.2013
comment
Следует добавить, что вы можете использовать ::foo для ссылки на глобальный foo, затененный в func. - person greatwolf; 03.07.2013
comment
Затенение уровня пространства имен аргументом вообще не имеет значения, поскольку фактический параметр, передаваемый функции, является уровнем пространства имен foo, поэтому локальная ссылка представляет тот же самый объект. - person David Rodríguez - dribeas; 03.07.2013

Если вы исправите все синтаксические ошибки и соберете весь проект, в файле будет одно целое число с именем 'foo', и к нему можно будет обращаться для чтения и записи из обоих источников. Установка значения в любом месте будет прочитана в любом другом месте.

person Balog Pal    schedule 02.07.2013