Законно ли иметь код (который компилируется в инструкции по сборке в глобальной области видимости исходного файла 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;
}
Ответ на вопрос, на который вы ссылались, был простым, без строгого именования 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
завершается, глобальные переменные должны быть уничтожены, что означает, что деструкторы должны быть вызваны.
Других решений пока нет …