глобальная переменная файловая переменная V.S. в C++

«Вставка узла в n-ю позицию в связанном списке»:

Используйте std::list вместо того, чтобы свернуть свое собственное. Затем используйте std :: list :: insert .

Кроме того, рассмотрите просто использование вместо std:: vector. Список представляет собой ужасную (отслеживание указателя, создание кеша) структуру данных, которую можно использовать на современных процессорах. A std::vector почти всегда побьет его (независимо от того, что ваши учебники говорят о теоретической эффективности).

8
задан user36064 10 February 2009 в 22:41
поделиться

4 ответа

В C и C++ можно сделать глобальную переменную только доступной из файла, в котором это объявляется при помощи статического ключевого слова перед объявлением. Globals, которые не используют статическое ключевое слово, доступны от любого C или файла C++, скомпилированного в программу.

Статический глобальный метод удерживается от использования в C++ в пользу анонимных пространств имен. Любые объявления, помещенные в анонимном пространстве имен, также только доступны из того файла.

15
ответ дан 5 December 2019 в 06:24
поделиться

Программы C++ компилируются одна единица перевода за один раз (в основном, это означает, что каждый .cpp файл компилируется независимо).

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

Для явного требования внутренней связи используют ключевое слово static или, лучше, используйте пространства имен без имени.

7
ответ дан 5 December 2019 в 06:24
поделиться

Примечание: Эти правила относятся к C++ точно так же как C с некоторыми деловыми отношениями с обзором класса/структуры/пространства имен. (Я не заметил, что вопрос был о C++, не C.)

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

Когда Вы объявляете глобальную переменную в своем исходном файле C, как это:

// fileA.c
int hello = 42;

void printMessage() {
    printf("Hello, %d world(s)!\n", hello);
}

hello и printMessage экспортируются. Когда объектный файл C запрашивает названный символ'hello'(принятие простого ABI), подключения компоновщика это с hello экспортируемый fileA.c.

Теперь для другого случая. Когда Вы объявляете локальную переменную файла как это:

// fileB.c
static int world = 9001;

static void messagePrint() {
    printf("It's over %d!\n", world);
}

world и messagePrint не экспортируются. Когда объектный файл C запрашивает названный символ'hello', компоновщик не может соединить это с hello из fileB.c потому что нет никакой информации об этом в fileB.obj (или безотносительно).

Как может messagePrint знайте о world, хотя? Оба находятся в той же единице перевода. Объем берет здесь. Я уверен, что Вы найдете большую информацию об объеме через Google.

(Имеет соответствие имени символа стандарт функции/имени переменной в C? Я знаю, что это отличается для C++ (где нет никакой стандартизации для искажения имени), который является, почему я упоминаю ABI во-первых.)

((Если ABI правильный термин, даже?; P))

4
ответ дан 5 December 2019 в 06:24
поделиться

Единственная разница - то, что файловые переменные только доступны в файле. Но у них есть то же время жизни.

0
ответ дан 5 December 2019 в 06:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: