Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.92/12: Рейтинг темы: голосов - 12, средняя оценка - 4.92
4 / 4 / 2
Регистрация: 04.06.2015
Сообщений: 161
1

Глобальные переменные

19.06.2018, 12:25. Просмотров 2379. Ответов 48
Метки нет (Все метки)

Объясните пожалуйста как правильно заводить глобальную переменную:
C++
1
static int k;
или
C++
1
int k;
в чем разница?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.06.2018, 12:25
Ответы с готовыми решениями:

Глобальные и статические глобальные переменные
Скажите, чем отличаются глобальные переменные от статических глобальных переменных?

Глобальные переменные
Как в C++ завести глобальную (общую для функции и самой программы) переменную?

Глобальные переменные
Доброго времени суток всем. У меня следующая проблема: объявляю глобально переменную типа...

Глобальные переменные
Здравствуйте! Возникла видимо классическая проблема, но перечитав кучу сайтов так ее и не решил....

48
6909 / 5974 / 2709
Регистрация: 14.04.2014
Сообщений: 25,504
19.06.2018, 12:53 2
В глобальной области просто int.
0
319 / 300 / 171
Регистрация: 16.11.2010
Сообщений: 1,069
Записей в блоге: 9
19.06.2018, 13:08 3
Sierra26, int k; - это глобальная переменная на уровне файла, static int k; - это глобальная переменная на уровне всего проекта
0
4 / 4 / 2
Регистрация: 04.06.2015
Сообщений: 161
19.06.2018, 13:27  [ТС] 4
netBool, Не совсем понял. static int k; - это глобальная переменная на уровне всего проекта. А как ее проинициализировать в другом файле?

Добавлено через 21 секунду
nmcf, В глобальной области просто int. Почему?
0
(80 / 20 || 50 / 50) = x
1609 / 1090 / 421
Регистрация: 16.08.2014
Сообщений: 4,574
Записей в блоге: 1
19.06.2018, 13:33 5
Цитата Сообщение от netBool Посмотреть сообщение
int k; - это глобальная переменная на уровне файла, static int k; - это глобальная переменная на уровне всего проекта
наоборот
1
174 / 138 / 105
Регистрация: 14.04.2016
Сообщений: 735
19.06.2018, 13:40 6
Цитата Сообщение от Sierra26 Посмотреть сообщение
просто int. Почему?
Вы можете и static, но зачем? В любом случае глобальная будет существовать на протяжении всей работы программы, чего нельзя сказать о нестатической локальной.

Добавлено через 6 минут
Цитата Сообщение от _stanislav Посмотреть сообщение
наоборот
C
1
2
3
4
5
6
7
8
9
10
#include "Test.h"
 
int main()
{
    printf("%d\n", a);
    a += 10;
    Test();
    system("pause");
    return 11;
}
C
1
2
3
4
5
6
7
8
9
10
11
12
13
#ifndef _TEST_H
#define _TEST_H
 
#include <stdio.h>
 
static int a = 0;
 
int Test()
{
    printf("%d\n", a);
}
 
#endif
Чёт видна и изменяется даже...
2
Эксперт С++
8179 / 3776 / 815
Регистрация: 15.11.2014
Сообщений: 8,588
19.06.2018, 13:41 7
глобальные переменные уже являются статическими.
ключевое слово static ограничивает область видимости ед. трансляцией
2
70 / 57 / 48
Регистрация: 12.03.2017
Сообщений: 566
19.06.2018, 13:48 8
Цитата Сообщение от Sierra26 Посмотреть сообщение
Объясните пожалуйста как правильно заводить глобальную переменную:
Удалено
0
(80 / 20 || 50 / 50) = x
1609 / 1090 / 421
Регистрация: 16.08.2014
Сообщений: 4,574
Записей в блоге: 1
19.06.2018, 13:56 9
SlavaSokolov,
Цитата Сообщение от SlavaSokolov Посмотреть сообщение
#include "Test.h"
int main()
{
* * printf("%d\n", a);
* * a += 10;
* * Test();
* * system("pause");
* * return 11;
}
вася, Test.h зачем подключил, у тебя при подключении образовалась одна единица трансляции

Добавлено через 1 минуту
Цитата Сообщение от hoggy Посмотреть сообщение
глобальные переменные уже являются статическими.
ключевое слово static ограничивает область видимости ед. трансляцией
+++
1
174 / 138 / 105
Регистрация: 14.04.2016
Сообщений: 735
19.06.2018, 13:58 10
_stanislav,
Цитата Сообщение от _stanislav Посмотреть сообщение
это глобальная переменная на уровне файла, static int k; - это глобальная переменная на уровне всего проекта
Исходя из этих слов должно быть:
C
1
2
3
int a
//отличается от
static int b
Тем, что a, видна для всего проекта, в то время как b только в файле. Нет?
0
319 / 300 / 171
Регистрация: 16.11.2010
Сообщений: 1,069
Записей в блоге: 9
19.06.2018, 14:00 11
Цитата Сообщение от _stanislav Посмотреть сообщение
наоборот
В смысле наоборот? Если объявить static int k в заголовочном файле, она будет видна во всех файлах, куда этот файл подключен, а int k - нет. И никак не наоборот

Цитата Сообщение от Sierra26 Посмотреть сообщение
А как ее проинициализировать в другом файле?
Как, как... Как обычную переменную k=5;
0
(80 / 20 || 50 / 50) = x
1609 / 1090 / 421
Регистрация: 16.08.2014
Сообщений: 4,574
Записей в блоге: 1
19.06.2018, 14:01 12
Цитата Сообщение от SlavaSokolov Посмотреть сообщение
в то время как b только в файле.
в единице трансляции
1
Эксперт С++
8179 / 3776 / 815
Регистрация: 15.11.2014
Сообщений: 8,588
19.06.2018, 14:03 13
бред жеж. вы , если книжки не читаете, попробывали б для начала на практике ароверить то
0
2019 / 607 / 220
Регистрация: 10.02.2018
Сообщений: 1,387
19.06.2018, 14:04 14
Sierra26, грубо говоря, для переменных есть два базовых понятия: область видимости и время жизни. Если разобраться с этими понятиями, то дольше всё будет гораздо понятнее.
0
(80 / 20 || 50 / 50) = x
1609 / 1090 / 421
Регистрация: 16.08.2014
Сообщений: 4,574
Записей в блоге: 1
19.06.2018, 14:08 15
Цитата Сообщение от netBool Посмотреть сообщение
а int k - нет
да ты гонишь

Добавлено через 1 минуту
и то и другое будет видно во всех файлах куда он подключен, птаму что при подключение файлов в другие файлы образуется одна единица трансляции
1
Грамотный. Безпорно.
16793 / 9692 / 1869
Регистрация: 27.09.2012
Сообщений: 24,054
Записей в блоге: 2
19.06.2018, 14:10 16
Цитата Сообщение от netBool Посмотреть сообщение
В смысле наоборот?
В прямом. Вот прям берешь цитату:
Цитата Сообщение от netBool Посмотреть сообщение
int k; - это глобальная переменная на уровне файла, static int k; - это глобальная переменная на уровне всего проекта
и меняешь значение на обратное:
int k; - это глобальная переменная на уровне всего проекта, static int k; - это глобальная переменная на уровне файла.
Вот так лучше стало.
Цитата Сообщение от netBool Посмотреть сообщение
Если объявить static int k в заголовочном файле, она будет видна во всех файлах, куда этот файл подключен, а int k - нет.
Без static будет multiple definition, т.к. переменная будет торчать из каждой единицы трансляции наружу.
Со static - в каждой единице трансляции будет своя переменная k, которые между собой никак не связанны.
hoggy уже написал, что будет делать static для глобальных переменных.
0
648 / 270 / 92
Регистрация: 04.07.2014
Сообщений: 760
19.06.2018, 14:48 17
Цитата Сообщение от SlavaSokolov Посмотреть сообщение
Чёт видна и изменяется даже...
foo.hpp:
C++
1
2
3
4
5
#pragma once
 
static int a;
 
void foo();
foo.cpp:
C++
1
2
3
4
5
6
7
8
9
#include "foo.hpp"
 
#include <iostream>
 
void foo() {
  std::cout << "foo: a == " << a << "\n";
  a += 100;
  std::cout << "foo: a == " << a << "\n";
}
main.cpp:
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
 
#include "foo.hpp"
 
int main() {
  std::cout << "main: a == " << a << "\n";
  foo();
  foo();
  foo();
  std::cout << "main: a == " << a << "\n";
  return 0;
}
Результат:
Код
main: a == 0
foo: a == 0
foo: a == 100
foo: a == 100
foo: a == 200
foo: a == 200
foo: a == 300
main: a == 0
[сарказм]Чёт видны, но меняются как-то странно.. [/сарказм]
1
зомбяк
1412 / 1077 / 309
Регистрация: 14.05.2017
Сообщений: 3,523
19.06.2018, 14:57 18
Цитата Сообщение от AlexVRud Посмотреть сообщение
Чёт видны, но меняются как-то странно..
Потому что не туда написал. Нужно

foo.hpp
C++
1
2
3
#pragma once
 
void foo();
foo.cpp
C++
1
2
3
4
5
6
7
8
9
10
#include "foo.hpp"
#include <iostream>
 
static int a;
 
void foo() {
  std::cout << "foo: a == " << a << "\n";
  a += 100;
  std::cout << "foo: a == " << a << "\n";
}
После этого попробуй.
1
319 / 300 / 171
Регистрация: 16.11.2010
Сообщений: 1,069
Записей в блоге: 9
19.06.2018, 15:01 19
Цитата Сообщение от hoggy Посмотреть сообщение
бред жеж. вы , если книжки не читаете, попробывали б для начала на практике ароверить то
Так я ж и пробовал ж/ тестовый:

test.h:
C++
1
2
3
4
5
6
int h;
 
class A{
public:
    int r;
};
test.cpp:
C++
1
#include "test.h"
main.h:
C++
1
#include "test.h"
int h; - выдаст ошибку, т.к. продублируется. Вывод: такие "глобальные" переменные можно использовать только внутри *.cpp-файлов, а значит они будут видимы только внутри конкретного *.cpp файла. Логично?

если ж ее объявить вместо int h; как static int h; и поместить в любой заголовочный файл, то она будет видна в любом файле, куда будет подключен test.h. Вроде логично
0
зомбяк
1412 / 1077 / 309
Регистрация: 14.05.2017
Сообщений: 3,523
19.06.2018, 15:06 20
А смысл в том, что если сделать в foo.cpp
C++
1
int a;
а в main.cpp
C++
1
extern int a;
то a будет действительно общей на весь проект. А вот сделать аналогично со static int a не получится - она (объявленная в foo.cpp ) останется только в единице трансляции из foo.cpp

Добавлено через 2 минуты
Если её оставлять именно в заголовочном файле, то получится как у netBool, но судя по листингу AlexVRud, работать нормально даже со static оно всё равно не будет - на каждую единицу трансляции получится свой static int a ...
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.06.2018, 15:06

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

глобальные переменные
здравствуйте, я только начал изучать C++, в книге Штидта Г. есть такой код, он выводит: count +...

Глобальные переменные
Я хочу использовать глобальную переменную, определённую в main, в своих классах. Листинг)) ...

Глобальные переменные
Видел в некоторых проектах создают глобальные переменные 1 вариант: int test; 2 вариант:...

Глобальные переменные
Здравствуйте, только начал изучать глобальные переменные/разбитие на функции и решил по...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.