Как работает пространство имён для имён функций в С++

Рейтинг: 0Ответов: 0Опубликовано: 16.01.2023

почему работает данный ниже код, разбитый на 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;
    }
}

Ответы

Ответов пока нет.