запуск — Может ли C ++ иметь код в глобальной области видимости?

Законно ли иметь код (который компилируется в инструкции по сборке в глобальной области видимости исходного файла C ++? Раньше у меня сложилось впечатление, что кроме Ch язык программирования (интерпретатор C / C ++), вы не можете иметь код в глобальной области видимости программы на C ++. Код / инструкции могут быть только внутри тела функции [точка]!

Однако я обнаружил, что вы можете вызывать функции перед главной функцией в C ++, назначая их глобальной переменной! Это будет связано с call Инструкция по сборке кода. Также вы можете назначить сумму двух переменных в другую глобальную переменную вне кода сборки. Это почти наверняка связано с add а также mov инструкции. И если этот код находится в глобальной области, вне какой-либо функции, когда он будет выполняться? Если + были ли перегруженные операторы типа класса, если в них был оператор print, когда это выполнялось бы?

Также можете ли вы иметь циклы и управляющие структуры в глобальной области действия программы на C ++, и если да, когда они выполняются? А как насчет других программных конструкций, разрешены ли они в глобальном масштабе, и при каких обстоятельствах и когда они выполняются?

Этот вопрос является ответом на предыдущий вопрос, который я разместил:
Почему я не могу присвоить значения глобальным переменным вне функции в C?

Ответчик на исходный вопрос утверждает, что вы не можете иметь код вне области действия функции. Я думаю, что я не совсем понимаю правила для этого, и что именно считается «код» или нет.

int foo() {
cout << "Inside foo()" << endl;
return 5;
}

// is this not code?
int global_variable = foo();

// How does this statement work without generating code?
int a = 4;
int b = 5;
int c = a + b;

int main() {
// The program behaves as if the statements above were executed from
// top to bottom before entering the main() function.
cout << "Inside main()" << endl;
cout << "int c = " << c << endl;
return 0;
}

5

Решение

Ответ на вопрос, на который вы ссылались, был простым, без строгого именования C ++ для конструкций.

Будучи более педантичным, C ++ не имеет «кода». C ++ имеет объявления, определения и утверждения. Заявления — это то, что вы, вероятно, считаете «кодом»: if, for, выражения и т. д.

Только объявления и определения могут появляться в глобальной области видимости. Конечно, определения могут включают выражения. int a = 5; определяет глобальную переменную, инициализированную выражением.

Но вы не можете просто иметь случайное выражение / выражение в глобальном масштабе, как a = 5;, То есть выражения могут быть частью определений, но выражение не является определением.

Вы можете вызвать функции раньше main конечно. Конструкторы и инициализаторы глобальных переменных, которые слишком сложны для выполнения во время компиляции, должны выполняться до main, Например:

int b = []()
{
std::cout << "Enter a number.\n";
int temp;
std::cin >> temp;
return temp;
}()

Компилятор не может сделать это во время компиляции; это интерактивно. И C ++ требует, чтобы все глобальные переменные были инициализированы до main начинается. Таким образом, компилятор должен будет вызывать код предварительноmain, Что совершенно законно.

Каждая система компиляции и выполнения C ++ имеет некоторый механизм для вызова кода перед а также после main, Глобальные объекты должны быть инициализированы, и конструкторы объектов могут быть вызваны для выполнения этой инициализации. После main завершается, глобальные переменные должны быть уничтожены, что означает, что деструкторы должны быть вызваны.

14

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]