#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;
Хотя все это прекрасно и модно, глобальные переменные (изменяемый внешний вид во время выполнения)-это запах кода. Так что лучше не входить в привычку их использовать.