Как работает пространство имён для имён функций в С++
почему работает данный ниже код, разбитый на 3 файла: один основной с функцией main(), второй заголовочный файл .h и третий файл реализаций функций из данного заголовочного файла.
В данном коде используется только операция :: разрешения контекста для доступа к отдельным элементам соответствующего пространства имён, однако если не указывать идентификатор пространства имён для имён функций, то код по-прежнему без ошибок и предупреждений компилируется и запускается. В чём причина? Почему для всех идентификаторов пространства имён нужно указывать имя этого пространства имён, а для имён функций в данном коде - нет?
(Проверял данный вопрос на другой тестовой, но уже 1-файловой программе С++, там этот фокус не работает, т.е. для всех имён, в том числе и для имён функций необходимо было указывать имя соответствующего пространства имён, в котором находились прототип и определение функции.)
Для создания программы использовались:
- ОС Linux Mint 20
- Компилятор g++ для языка С++
- Текстовый редактор Sublime Text 4
1-й файл основной:
// use_nmsp.cpp -- using namespaces
// Compile along with namesp.cpp
#include <iostream>
#include "namesp.h"
void other(void);
void another(void);
int main(void)
{
debts::Debt golf = {{"Benny", "Goatsniff"}, 120.0};
show_debt(golf);
other();
another();
return 0;
}
void other(void)
{
pers::Person dg = {"Doodles", "Glister"};
show_person(dg);
std::cout << std::endl;
debts::Debt zippy[3];
int i;
for (i = 0; i < 3; i++)
get_debt(zippy[i]);
for (i = 0; i < 3; i++)
show_debt(zippy[i]);
std::cout << "Total debt: $" << sum_debts(zippy, 3) << std::endl;
}
void another(void)
{
pers::Person collector = {"Milo", "Rightshift"};
show_person(collector);
std::cout << std::endl;
}
2-й файл заголовочный:
// namesp.h -- header file for namesp.cpp, use_nmsp.cpp
#include <string>
// Creation namespaces pers and debts
namespace pers
{
struct Person {
std::string fname;
std::string lname;
};
void get_person(Person &);
void show_person(const Person &);
}
namespace debts
{
struct Debt {
pers::Person name;
double amount;
};
void get_debt(Debt &);
void show_debt(const Debt &);
double sum_debts(const Debt ar[], int n);
}
3-й файл реализаций функций из заголовочного файла:
// namesp.cpp -- function definitions from its namespaces
// Compile along with use_nmsp.cpp
#include <iostream>
#include "namesp.h" // For structures, function prototypes
namespace debts
{
void get_debt(Debt & rd)
{
get_person(rd.name);
std::cout << "Enter debt: ";
std::cin >> rd.amount;
}
void show_debt(const Debt & rd)
{
show_person(rd.name);
std::cout << ": $" << rd.amount << std::endl;
}
double sum_debts(const Debt ar[], int n)
{
double total = 0;
for (int i = 0; i < n; i++)
total += ar[i].amount;
return total;
}
}
namespace pers
{
void get_person(Person & rp)
{
std::cout << "Enter first name: ";
std::cin >> rp.fname;
std::cout << "Enter last name: ";
std::cin >> rp.lname;
}
void show_person(const Person & rp)
{
std::cout << rp.lname << ", " << rp.fname;
}
}