пространство имен myspace { int x } Теперь почему `myspace::x=3;` выдает ошибку?

#c #namespaces

Вопрос:

Код

 #include <iostream>
namespace myspace
{
    int x;
}

myspace::x=3; // This line is giving error.
int main()
{
    myspace::x=5;
    return 0;
}
 

Выход

 Error: C   requires a type specifier for all declarations
 

Так почему же строка myspace::x=3; выдает ошибку, что C требует спецификатора типа для всех объявлений ?

Комментарии:

1. Та же ситуация, int x; x = 3; int main() {} что и .

Ответ №1:

Заявление

 myspace::x=3;
 

это не инициализация, это простое назначение. Это ничем не отличается от

 myspace::x=5;
 

у вас есть внутренняя main функция.

Любое утверждение, которое не является объявлением или определением, не может быть внешними функциями.

Если вы хотите инициализировать переменную, сделайте это в определении:

 namespace myspace
{
    int x = 3;
}
 

Комментарии:

1. или godbolt.org/z/PYrjera5T

2. @Someprogrammerdude Я знаю, что это не платформа, чтобы говорить об этом, но я также не вижу другого варианта связаться с вами. Я учусь на последнем курсе выпускного. Так что нам предстоит какой-то исследовательский проект . Не могли бы вы, пожалуйста, дать идею для выполнения исследовательского проекта на C

Ответ №2:

Вы предоставили определение при первом объявлении переменной. И, как отмечали другие myspace::x=3; , представляет собой выражение присваивания в области пространства имен, что недопустимо.

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

 namespace myspace
{
    extern int x;
}
 

Для определения все равно потребуется спецификатор типа (как и для всех определений), но он будет выглядеть примерно так, как вы себе представляли

 int myspace::x = 3;
 

Хотя все это прекрасно и модно, глобальные переменные (изменяемый внешний вид во время выполнения)-это запах кода. Так что лучше не входить в привычку их использовать.