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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
notAll
410 / 131 / 29
Регистрация: 27.05.2016
Сообщений: 347
Завершенные тесты: 2
#1

Локальные имена для файла - C++

05.07.2016, 12:18. Просмотров 160. Ответов 6
Метки нет (Все метки)

Локальные имена для файла, те которые объявлены как static или в безымянном namespace почему то доступны в другом файле. Почему это так или как это правильно тогда использовать?
header.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#ifndef HEADER_H
#define HEADER_H
 
#include <iostream>
 
int i = 1;
const int ci = 2;
static int si = 3;
static const int sci = 4;
 
namespace
{
    int nsi = 5;
    void foo() {std::cout << "foo()";}
}
 
#endif // HEADER_H

main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include "header.h"
 
int main()
{
    std::cout << i << "\n";   //1
    std::cout << ci << "\n";  //2
    std::cout << si << "\n";  //3
    std::cout << sci << "\n"; //4
 
    std::cout << nsi << "\n";  //5
    foo(); //foo()
}
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.07.2016, 12:18
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Локальные имена для файла (C++):

Матрицы: все локальные минимумы заменить на 0, матрицу читать с файла - C++
Дана матрица размера M x N. Элемент называется локальным минимумом (максимумом), если она меньше его окружающих элементов. Заменить все...

Имена входного и выходного файла - C++
Написал код программы, но еще нужно чтобы Входные данные были в файле Z.inp Результат работы были в файле Z.out, как это сделать не знаю.

Вывести имена файлов в порядке убывания размера файла - C++
Имеется файл со строками : body.docx 13456 lab.docx 4567 con.docx 17654 bre.docx 24567 l2.docx 11124 Как вывести имена...

Как изменить обычные имена массивов на имена с указателями? - C++
надо чтобы указатели использовались #include &lt;iostream&gt; #include &lt;cstdlib&gt; #include &lt;ctime&gt; using namespace std; int main() ...

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

Имена файлов для fstream. - C++
Всем привет. Как использовать разные имена файлов? Вот что у меня получилось... #include &lt;iostream&gt; #include &lt;fstream&gt; ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Croessmah
Эксперт CЭксперт С++
13215 / 7487 / 842
Регистрация: 27.09.2012
Сообщений: 18,404
Записей в блоге: 3
Завершенные тесты: 1
05.07.2016, 12:23 #2
Цитата Сообщение от notAll Посмотреть сообщение
Почему это так
А зачем Вы их в хедер запихали?
Включили хедер в две единицы трансляции - получите в каждой код из хедера
0
notAll
410 / 131 / 29
Регистрация: 27.05.2016
Сообщений: 347
Завершенные тесты: 2
05.07.2016, 12:28  [ТС] #3
Цитата Сообщение от Croessmah Посмотреть сообщение
А зачем Вы их в хедер запихали?
Ну не знаю, я думал что локальные имена для файла останутся не доступны. Если ничего в майне не подключать, то само собой что ничего видно не будет.
0
Croessmah
Эксперт CЭксперт С++
13215 / 7487 / 842
Регистрация: 27.09.2012
Сообщений: 18,404
Записей в блоге: 3
Завершенные тесты: 1
05.07.2016, 13:02 #4
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от notAll Посмотреть сообщение
Ну не знаю, я думал что локальные имена для файла останутся не доступны
Они "локальны" не для файла, а для единицы трансляции:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
//some.cpp
#include <iostream>
 
void foo(){
   std::cout << "foo" << std::endl;
}
 
 
namespace {
   void bar(){
      std::cout << "bar" << std::endl;
   }
}
C++
1
2
3
4
5
6
7
8
9
//main.cpp
 
void foo();
void bar();
 
int main(){
   foo();//ok
   bar();//error - undefined reference
}
1
notAll
410 / 131 / 29
Регистрация: 27.05.2016
Сообщений: 347
Завершенные тесты: 2
05.07.2016, 13:17  [ТС] #5
А где такое применение безымянного namespace может пригодиться на практике? Тут больше проблем получается чем пользы - подключил заголовок с таким namespace(напрямую иле косвенно) и потом думаєш почему у тебя имена не однозначны.
0
Croessmah
Эксперт CЭксперт С++
13215 / 7487 / 842
Регистрация: 27.09.2012
Сообщений: 18,404
Записей в блоге: 3
Завершенные тесты: 1
05.07.2016, 13:26 #6
Цитата Сообщение от notAll Посмотреть сообщение
и потом думаєш почему у тебя имена не однозначны.
То, что в безымянном пространстве не видно снаружи,
так что о какой неоднозначности идет речь?
Цитата Сообщение от notAll Посмотреть сообщение
Тут больше проблем получается чем пользы - подключил заголовок с таким namespace
А на кой черт это в заголовок пихать?
Это всё равно что отправить посылку с протухшими помидорами,
а потом кричать, что от почты никакой пользы, а одни проблемы.
Тем более после того, как получатель приедет к Вам и "разукрасит" за такой подгон
Цитата Сообщение от notAll Посмотреть сообщение
А где такое применение безымянного namespace может пригодиться на практике?
Когда есть функции, которые используются только в
данной единице трансляции и не нужно их "светить" наружу.
1
notAll
410 / 131 / 29
Регистрация: 27.05.2016
Сообщений: 347
Завершенные тесты: 2
05.07.2016, 13:41  [ТС] #7
Все, понял, - в заголовки безымянные namespace не пихать.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.07.2016, 13:41
Привет! Вот еще темы с ответами:

Как создать разные имена для файлов - C++
Как сделать так чтобы при каждом новом проходе цикла создавался новый файл? #include&lt;fstream&gt; int main() { std::ofstrem...

Почему в С++ используются сложные имена для структур? - C++
Их читать сложно. BITMAPFILEHEADER LPBITMAPFILEHEADER PBITMAPFILEHEADER FONTSIGNATURE PFONTSIGNATURE LPFONTSIGNATURE

Используя структуру для определения понятия студент, распечатать фамилии и имена отличников. - C++
14. Используя структуру для определения понятия студент (состоящую из полей ФИО, курс, группа, оценки в сессию) распечатать фамилии и имена...

Приложение для игры в монополию. Сохраняет имена игроков и их баланс в структуру. Позволяет изменять баланс - C++
Дальше функции menu() дело не уходит. В чем ошибка? // Приложение должно считывать, выводить имя и баланс игрока в монополии, изменять...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
05.07.2016, 13:41
Ответ Создать тему
Опции темы

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