Пространства имен делают методы прототипирования устаревшими в C ++? - PullRequest
2 голосов
/ 21 января 2012

Я перехожу на C ++ из C, и первое, что я заметил, это избыточность прототипирования внутри пространства имен.Я пытаюсь использовать функциональность пространств имен для четкой маркировки моих дополнений / модификаций.

namespace ns {
    void sayHello (void);   //<-- NOT REQUIRED, BUT IS THERE ANY PURPOSE?
    void sayHello (void) {
        std::cout << "Hello world!";
        return;
    }
}

int main(int argc, char *argv[]) {
    ns::sayHello();
}

Раньше в C было неплохо иметь прототип, чтобы вам не требовалось писатьфункции "выше" main () в источнике.Мне кажется, что пространства имен должны быть определены перед использованием, поэтому любые вложенные функции также должны быть написаны перед использованием.

Я только запускаю C ++ и хочу начать правильно.Я читал несколько учебных пособий через Интернет, но они действительно не упоминают эту тему.Я знаю, что это "просто", но, пожалуйста, избавьте меня от лишних голосов и отразите комментарии.Если кто-то в состоянии, я был бы признателен за более глубокое обсуждение того, является ли это устаревшим, и / или сценарии, которые могут в конечном итоге кусать нового разработчика C ++.

Ответы [ 4 ]

5 голосов
/ 21 января 2012

Не обязательно.Декларация и определение все еще разные понятия.Также обратите внимание, что пространство имен может охватывать несколько файлов, и определения не обязательно должны находиться в пространстве имен.

//test.h
namespace test
{
   void foo();
   //no implementation in header
}

//main.cpp
int main()
{
   test::foo();
   return 0;
}

//test.cpp
namespace test
{
   void foo() { };
   //definition here
   //without the definition, we'd get a link error
}

Разделение реализации в C ++ выполняется по таким причинам, как сохранение кода в секрете, быстрая компиляцияопределение в заголовке потребует перекомпиляции всех файлов, включая файлы), скрывая детали реализации или более чистую структуру.

0 голосов
/ 21 января 2012

Я не уверен, правильно ли я понял ваш вопрос.Тем не менее, пространства имен не изменили процедуру объявления / определения функций.Смысл пространств имен заключается в том, чтобы дать возможность компилятору понять, какую версию foo () вы вызываете, если в ваших файлах содержится более одной версии.Вы помещаете определение сразу после объявления, тогда объявление больше не нужно (определение может работать также как объявление).Вам все еще нужен прототип, если вы разделяете объявление и определение в заголовочных и исходных файлах.Кстати, это рекомендуется, поскольку для того, кто использует ваш код, нужно просто включить заголовки (которые сообщают компилятору «как должны вызываться ваши функции»).Определение просто необходимо при связывании времени.

Надеюсь, я хотя бы немного ответил на ваш вопрос ...; -)

0 голосов
/ 21 января 2012

Вы помещаете объявления в заголовочный файл, а определения в исходный файл, например

Например, в ns.h:

namespace ns {
    void sayHello (void);
}

В ns.cc:

namespace ns {
    void sayHello (void) {
        std::cout << "Hello world!";
        return;
    }
}

В main.cc:

#include "ns.h"

int main(int argc, char *argv[]) {
    ns::sayHello();
}
0 голосов
/ 21 января 2012

Если вы разделите заголовок и файлы реализации, то потребуется прототип.

...