С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
45 / 21 / 6
Регистрация: 28.02.2013
Сообщений: 194
1

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

16.09.2015, 12:41. Показов 1295. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Решил что могу описать переменную в заголовочном файле, так, чтоб была переменная и была одна и была видна во всей программе из любой функции. 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;
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.09.2015, 12:41
Ответы с готовыми решениями:

Копирование по маске из одного места в другое в пределах каждой строки файла
Добрый день. Я новичек и прошу помощи в следующем: в файле надо в пределах каждой строки...

Переписать из одного файла в другой файл только четные числа
я сделал так,но у программы не получается переписать только четные числа,в чем ошибка,подскажите...

Программа выводит данные только одного текстового файла из трех
Даны три двухмерных массива: A (na x na), B (nb x nb) и C (nc x nc). Для каждого массива A,B,C...

Плагин Gulp-watch работает только для одного файла
Ребят, помогите туполобику. Я уже не знаю где копать. Я копировала 100%-но рабочий код. Я...

12
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
16.09.2015, 12:46 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;
};
Дабы не было ошибок переопределения.
0
45 / 21 / 6
Регистрация: 28.02.2013
Сообщений: 194
16.09.2015, 12:51  [ТС] 3
ForEveR, без static ругается что не может слинковать майн и что переменная уже определена в Foo.obj
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
16.09.2015, 12:53 4
nefton, Верно. Нужен спецификатор extern. Я исправил свой ответ.
0
45 / 21 / 6
Регистрация: 28.02.2013
Сообщений: 194
16.09.2015, 13:02  [ТС] 5
ForEveR, не получается. (
какие должны быть 3 файла чтоб я описал переменную в Foo.h,
изменил её в main.cpp
и после изменения она вывелась в консоль из Foo() (Foo.cpp)
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
16.09.2015, 13:06 6
Лучший ответ Сообщение было отмечено nefton как решение

Решение

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;
}
2
Эксперт С++
8972 / 4318 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
16.09.2015, 19:35 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.
1
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
16.09.2015, 19:40 8
hoggy,
Цитата Сообщение от hoggy Посмотреть сообщение
зы: не используйте extern.
Ну тут зависит. Если нужна именно переменная (да, такое бывает), можно использовать. Но то что лучше организовать функцию бесспорно.
0
Эксперт С++
8972 / 4318 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
16.09.2015, 20:09 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";
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
16.09.2015, 21:54 10
hoggy, Да, так симпатичнее. Но мы например юзаем extern, только в одном месте, для большого кол-ва переменных, которые используются потом по всему коду и не паримся особо по этому поводу. Писать под каждую нужную две функции... Перебор с моей точки зрения. Но все от ситуации конечно зависит.
0
Эксперт С++
8972 / 4318 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
16.09.2015, 22:09 11
Цитата Сообщение от ForEveR Посмотреть сообщение
Но мы например юзаем extern, только в одном месте
до main жизни нет?
ваш логгер нельзя вызвать, например,
что бы залоггировать конструирование статического объекта?

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

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

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

Не по теме:

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

0
Эксперт С++
8972 / 4318 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
17.09.2015, 01:08 13
Цитата Сообщение от ForEveR Посмотреть сообщение
БД
у мну это есть одна из подсистем.
0
17.09.2015, 01:08
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.09.2015, 01:08
Помогаю со студенческими работами здесь

Как установить выбор только одного заранее заданного файла в OpenDialog?
Можно ли сделать так, что-бы openStuff открывал определённый файл (без возможности выбора)

Переписать из одного файла в другой только третью и четвертую строки, содержащие пробелы
Из имеющегося файла a.txt, состоящего из 6 строк, переписать в файл b.txt третью и четвертую...

Вывести на экран только те строки исходного файла, которые состоят из одного слова
Вывести на экран только те строки исходного файла, которые состоят из одного слова.

Скопировать из одного файла в другой только натуральные четные числа и найти их сумму
Подскажите пожалуйста как преобразовать из char в integer? var a,b:file of char; c:char;...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru