Форум программистов, компьютерный форум CyberForum.ru

Static только в пределах одного файла? - C++

Восстановить пароль Регистрация
 
nefton
44 / 20 / 5
Регистрация: 28.02.2013
Сообщений: 184
16.09.2015, 12:41     Static только в пределах одного файла? #1
Решил что могу описать переменную в заголовочном файле, так, чтоб была переменная и была одна и была видна во всей программе из любой функции. static. работает замечательно, но только пока вся программа в одном файле.
А так:
Foo.h
C++
1
2
3
4
5
#pragma once
 
static int log_level;
 
void Foo();
Foo.cpp
C++
1
2
3
4
5
6
7
8
#include "Foo.h"
#include <iostream>
 
using namespace std;
 
void Foo(){
    cout << "log_level = " << log_level << endl;
};
main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "Foo.h"
#include <iostream>
 
using namespace std;
 
int main(){
 
    log_level = 1;
 
    Foo();
 
    cout << endl << endl;
    system("pause");
    
    return 0;
}
Выводит log_level=0;
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.09.2015, 12:41     Static только в пределах одного файла?
Посмотрите здесь:

OpenAL звук только с одного уха C++
multimap: Сортировка значений в пределах одного ключа C++
программу, которая считывает текст из файла и выводит на экран только предложения, начинающиеся с тире, перед которым могут находиться только пробелы C++
C++ Написать программу записи содержимого из одного файла в другой : Тип файла текстовый
Есть ли разница между подключением статической библиотеки и подключением одного только файла C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
16.09.2015, 12:46     Static только в пределах одного файла? #2
nefton, static указывает, что переменная будет доступна в модули трансляции, здесь два модуля трансляции, один Foo, второй main, поэтому и выводит log_level = 0. Вообще лучше конечно сделать не глобальную переменную, а какую-нибудь функцию или хотя бы запихнуть в namespace, но можно и через extern.

C++
1
2
3
4
5
#pragma once
 
extern int log_level;
 
void Foo();
C++
1
2
3
4
5
6
7
8
9
10
#include "Foo.h"
#include <iostream>
 
log_level = 0; 
 
using namespace std;
 
void Foo(){
    cout << "log_level = " << log_level << endl;
};
Дабы не было ошибок переопределения.
nefton
44 / 20 / 5
Регистрация: 28.02.2013
Сообщений: 184
16.09.2015, 12:51  [ТС]     Static только в пределах одного файла? #3
ForEveR, без static ругается что не может слинковать майн и что переменная уже определена в Foo.obj
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
16.09.2015, 12:53     Static только в пределах одного файла? #4
nefton, Верно. Нужен спецификатор extern. Я исправил свой ответ.
nefton
44 / 20 / 5
Регистрация: 28.02.2013
Сообщений: 184
16.09.2015, 13:02  [ТС]     Static только в пределах одного файла? #5
ForEveR, не получается. (
какие должны быть 3 файла чтоб я описал переменную в Foo.h,
изменил её в main.cpp
и после изменения она вывелась в консоль из Foo() (Foo.cpp)
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
16.09.2015, 13:06     Static только в пределах одного файла? #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Foo.h

C++
1
2
3
4
5
#pragma once
 
extern int log_level;
 
void Foo();
Foo.cpp
C++
1
2
3
4
5
6
7
8
9
10
#include "Foo.h"
#include <iostream>
 
using namespace std;
 
log_level = 0; 
 
void Foo(){
    cout << "log_level = " << log_level << endl;
};
main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "Foo.h"
#include <iostream>
 
using namespace std;
 
int main(){
 
    log_level = 1;
 
    Foo();
 
    cout << endl << endl;
    system("pause");
    
    return 0;
}
hoggy
5230 / 2121 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
16.09.2015, 19:35     Static только в пределах одного файла? #7
Цитата Сообщение от nefton Посмотреть сообщение
static. работает замечательно
вы не правильно его используете.

вам нужно такое:

C++
1
2
3
4
5
6
7
#pragma once
 
// --- самый грамотный способ организовать глобальную точку доступа
// из любой части программы
int& getLogLevel() { static int log_level; return log_level; }
 
void Foo();
зы: не используйте extern.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
16.09.2015, 19:40     Static только в пределах одного файла? #8
hoggy,
Цитата Сообщение от hoggy Посмотреть сообщение
зы: не используйте extern.
Ну тут зависит. Если нужна именно переменная (да, такое бывает), можно использовать. Но то что лучше организовать функцию бесспорно.
hoggy
5230 / 2121 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
16.09.2015, 20:09     Static только в пределах одного файла? #9
Цитата Сообщение от ForEveR Посмотреть сообщение
Если нужна именно переменная (да, такое бывает)
бывает, что нужно организовать имя.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// log.h
 
namespace tools{ 
 
    Logger& getLog() { static Logger l; return l; }
 
    static Logger& log( getLog()  );
 
} //namespace tools
 
// можно так:
// tools::getLog()[WARNING] << "resource not found";
 
// можно так:
// tools::log[WARNING]  << "resource not found";
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
16.09.2015, 21:54     Static только в пределах одного файла? #10
hoggy, Да, так симпатичнее. Но мы например юзаем extern, только в одном месте, для большого кол-ва переменных, которые используются потом по всему коду и не паримся особо по этому поводу. Писать под каждую нужную две функции... Перебор с моей точки зрения. Но все от ситуации конечно зависит.
hoggy
5230 / 2121 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
16.09.2015, 22:09     Static только в пределах одного файла? #11
Цитата Сообщение от ForEveR Посмотреть сообщение
Но мы например юзаем extern, только в одном месте
до main жизни нет?
ваш логгер нельзя вызвать, например,
что бы залоггировать конструирование статического объекта?

Добавлено через 1 минуту
Цитата Сообщение от ForEveR Посмотреть сообщение
Писать под каждую нужную две функции...
сингелтонов не бывает много.
поскольку обычно они выступают в качестве каких то подсистем.
так что не напрягает.

но те, что имеются,
обычно хочется использовать с "цивилизованными удобствами".

один раз напишим превентивно безопасный код,
а потом много много раз будем наслаждаться удобствами.
ForEveR
16.09.2015, 23:41
  #12

Не по теме:

hoggy, Это не логгер. Это некие объекты определенного класса, каждый из которых инициализируется загрузкой из БД, БД инициализируется только после считывания конфига, т.е. определенно после начала main, ну как-то так, это удобнее, нежели писать функции. Сделано так, через глобальные объекты, чтобы меньше тратить время постоянную загрузку/поиск, когда нужно использовать точно определенный объект. Для каждой задачи свое решение так-то и в нашем случае extern переменная смотрится более уместно с моей точки зрения.

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.09.2015, 01:08     Static только в пределах одного файла?
Еще ссылки по теме:

C++ Переписать из одного файла в другой только третью и четвертую строки, содержащие пробелы
Найти все формы слов, встречающиеся только у одного слова C++
C++ Вывести все числа, которые составлены из цифры только одного вида

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

Или воспользуйтесь поиском по форуму:
hoggy
5230 / 2121 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
17.09.2015, 01:08     Static только в пределах одного файла? #13
Цитата Сообщение от ForEveR Посмотреть сообщение
БД
у мну это есть одна из подсистем.
Yandex
Объявления
17.09.2015, 01:08     Static только в пределах одного файла?
Ответ Создать тему
Опции темы

Текущее время: 23:42. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru