Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
494 / 208 / 70
Регистрация: 27.05.2016
Сообщений: 554
1

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

05.07.2016, 12:18. Показов 952. Ответов 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)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.07.2016, 12:18
Ответы с готовыми решениями:

Матрицы: все локальные минимумы заменить на 0, матрицу читать с файла
Дана матрица размера M x N. Элемент называется локальным минимумом (максимумом), если она меньше...

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

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

Как изменить обычные имена массивов на имена с указателями?
надо чтобы указатели использовались #include &lt;iostream&gt; #include &lt;cstdlib&gt; #include &lt;ctime&gt;...

6
Don't worry, be happy
17268 / 10140 / 1963
Регистрация: 27.09.2012
Сообщений: 25,367
Записей в блоге: 1
05.07.2016, 12:23 2
Цитата Сообщение от notAll Посмотреть сообщение
Почему это так
А зачем Вы их в хедер запихали?
Включили хедер в две единицы трансляции - получите в каждой код из хедера
0
494 / 208 / 70
Регистрация: 27.05.2016
Сообщений: 554
05.07.2016, 12:28  [ТС] 3
Цитата Сообщение от Croessmah Посмотреть сообщение
А зачем Вы их в хедер запихали?
Ну не знаю, я думал что локальные имена для файла останутся не доступны. Если ничего в майне не подключать, то само собой что ничего видно не будет.
0
Don't worry, be happy
17268 / 10140 / 1963
Регистрация: 27.09.2012
Сообщений: 25,367
Записей в блоге: 1
05.07.2016, 13:02 4
Лучший ответ Сообщение было отмечено notAll как решение

Решение

Цитата Сообщение от 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
494 / 208 / 70
Регистрация: 27.05.2016
Сообщений: 554
05.07.2016, 13:17  [ТС] 5
А где такое применение безымянного namespace может пригодиться на практике? Тут больше проблем получается чем пользы - подключил заголовок с таким namespace(напрямую иле косвенно) и потом думаєш почему у тебя имена не однозначны.
0
Don't worry, be happy
17268 / 10140 / 1963
Регистрация: 27.09.2012
Сообщений: 25,367
Записей в блоге: 1
05.07.2016, 13:26 6
Цитата Сообщение от notAll Посмотреть сообщение
и потом думаєш почему у тебя имена не однозначны.
То, что в безымянном пространстве не видно снаружи,
так что о какой неоднозначности идет речь?
Цитата Сообщение от notAll Посмотреть сообщение
Тут больше проблем получается чем пользы - подключил заголовок с таким namespace
А на кой черт это в заголовок пихать?
Это всё равно что отправить посылку с протухшими помидорами,
а потом кричать, что от почты никакой пользы, а одни проблемы.
Тем более после того, как получатель приедет к Вам и "разукрасит" за такой подгон:black_eye.:
Цитата Сообщение от notAll Посмотреть сообщение
А где такое применение безымянного namespace может пригодиться на практике?
Когда есть функции, которые используются только в
данной единице трансляции и не нужно их "светить" наружу.
1
494 / 208 / 70
Регистрация: 27.05.2016
Сообщений: 554
05.07.2016, 13:41  [ТС] 7
Все, понял, - в заголовки безымянные namespace не пихать.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.07.2016, 13:41

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

Удалить из 1 файла все строки, где встречаются доменные имена из 2 файла
Есть два файла .txt, в первом (1.txt) лист урл адресов, в втором 2.txt только доменные имена....

Копирование файла, используя имена исходного и копируемого файла как аргументы командной строки
Напишите программу копирования файла, которая использует имена исходного файла и копируемого файла...

TASM. Копирование указанного файла (имена исходного и результирующего файла задаются в командной строке)
Нашел программу, но не смог добиться работы от нее. Описание: Пример программы (в формате DOS...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru