Я не уверен, что мое описание описывает проблему соответствующим образом. Я нашел это, когда пытаюсь понять внешнюю связь и внутреннюю связь. Скажем, у меня есть проект, содержащий 2 файла:Является ли законным/хорошим поставить прототип функции, определенной в другом исходном файле (а не в заголовке)?
//A.cpp
#include <iostream>
void doSomething();
int main()
{
doSomething();
return 0;
}
//B.cpp
#include <iostream>
void doSomething()
{
std::cout << "Doing it" << std::endl;
std::cin.get();
}
Обратите внимание: ни один из двух файлов не является заголовком. Они просто предоставляют 2 единицы перевода.
Я удивлен, обнаружив, что это может скомпилироваться и работать правильно. Я привык к написанию кодов, как это, чтобы избежать ошибки мульти-определения, когда у меня такая же функция полезности (как линейная интерполяция) в различных файлах:
//A.cpp
#include <iostream>
static void doSomething()
{
std::cout << "Doing it" << std::endl;
std::cin.get();
}
int main()
{
doSomething();
return 0;
}
//B.cpp
#include <iostream>
static void doSomething()
{
std::cout << "Doing it" << std::endl;
std::cin.get();
}
/* some other functions that call doSomething() */
Это, очевидно, излишним, и подход выше, кажется, реши это. Но я удивляюсь, действительно ли это принятый стиль? Невозможно даже найти определение функции без помощи IDE.
Ах да. Помещение прототипа функции фактически эквивалентно включению заголовка, содержащего только этот прототип. Не понял. Спасибо! –
Это не просто эквивалент, но на самом деле * тот же *. Препроцессор строит это так, чтобы к тому времени, когда он был скомпилирован, он выглядит точно так же, сохранен ли вы в отдельном файле или нет. – OJFord