Просто хочу убедиться, что я понимаю, что внешняя переменная - PullRequest
2 голосов
/ 15 марта 2012

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

Я погуглил, но это не совсем понятно, и я хочу убедиться, так как это довольно важно.

Ответы [ 3 ]

2 голосов
/ 15 марта 2012

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

Существует как минимум две интерпретации externalпеременные .

Во-первых, у нас есть ключевое слово extern, которое в основном символизирует то, что вы бы назвали глобальной переменной.Это переменная, объявленная в нескольких единицах перевода, но она существует только в одном месте в памяти.Он инициализируется в одном файле, и все последующие изменения влияют на каждую область, в которой используется переменная:

//globals.cpp
int x = 1337;

//main.cpp
extern int x;

int main()
{
   //x is 1337 here
   return 0;
}

Вторым значением может быть переменная, которая объявлена ​​и определена в области видимости класса, но не используется как extern.Однако вы можете считать это внешним по отношению к методам.

//main.cpp
int x = 1337; //is this external?
              //could be, remove it just to be safe

int main()
{
   return 0;
}
1 голос
/ 15 марта 2012

Внешняя переменная - это переменная с внешней связью.

Переменная с внешней связью - это переменная, определенная в области видимости файла без ключевого слова static.

int bla = 0;           // external variable
static int blop =  1;  // non-external variable

int main(void)
{
    return bla
}

Обратите внимание, чтопеременная, объявленная с ключевым словом extern, не обязательно имеет внешнюю связь.Как const не означает постоянную в C, extern не означает внешнюю.

Люди часто используют слово external, чтобы сказать, что переменная фактически объявлена ​​в текущей единице перевода, но определена в другом переводеблок.

1 голос
/ 15 марта 2012

Давайте рассмотрим все возможные случаи, потому что из вашего вопроса я тоже не уверен:

В качестве ключевого слова используется extern.Чтобы понять это, вы должны понимать единицы компиляции.По сути, каждый файл представляет собой единицу компиляции, поэтому каждый .c компилируется в .o с заменой заголовков.В каждом модуле компиляции вы пересылаете объявления ожидаемых символов - например, функций, принадлежащих другим модулям компиляции.

Теперь, если вы объявляете глобальную переменную в одном файле .c, это глобально, еслифайл, но вообще не существует как символ в каком-либо другом файле - компилятор выдаст ошибку, потому что он не знает, где была объявлена ​​эта переменная.

(Конечно, если вы объявите переменную в заголовке- он будет существовать во всех объектах, в которые включен заголовок, и тогда компоновщик будет дуться, потому что, когда он связывает все объекты, некоторые символы будут иметь одинаковое имя).

Чтобы обойти это, можно определить переменную, например, с помощью extern int x;.Это говорит о том, что компилятор a) int x должен быть доступен для этого модуля компиляции, b) int x не в этом модуле компиляции и c) компоновщик должен проверить, что он существует где-то во всех модулях, которые вы 'мы собрали вместе, чтобы сформировать библиотеку или программу.

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


Другой случай - это "внешние переменные"означает что-то внешнее для определенной области или модуля, который у вас есть.Я бы очень внимательно проверил ваше задание и, если сомневался, спросил бы - кто бы его ни назначил, он сможет точно объяснить вам, что они означают.

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