Основной вопрос C ++ относительно объема функций - PullRequest
1 голос
/ 28 января 2009

Я только начинаю изучать C ++, поэтому вам придется мириться с моим невежеством. Есть ли способ объявить функции так, чтобы на них можно было ссылаться без написания перед функцией, которая их использует. Я работаю с одним файлом cpp (не моим решением), и мои функции вызывают себя, поэтому на самом деле нет правильного порядка их размещения. Есть ли способ #define функций до их использования или что-то в этом роде? Или, может быть, способ пометить их оператором области видимости, который не подразумевает, что они на самом деле являются частью класса?

Заранее спасибо

Ответы [ 5 ]

9 голосов
/ 28 января 2009

Вы можете написать функцию прототипы перед их реализацией. Прототип функции называет функцию, ее тип возвращаемого значения и тип ее аргументов. Единственное, что должно быть выше вызова вашей функции - это прототип. Вот пример:

// prototype
int your_function(int an_argument);

// ...
// here you can write functions that call your_function()
// ...

// implementation of your_function()
int your_function(int an_argument) {
    return an_argument + 1;
}
4 голосов
/ 28 января 2009

Вам нужна функция объявление (она же прототип ). Объявление - это возвращаемый функцией тип, имя и список аргументов без тела. Они обычно находятся в заголовочных файлах, но они не должны быть. Вот пример:

#include< stdio >
using namespace std;

void bar( int x );  // declaration
void foo( int x );  // declaration

int main() {
    foo( 42 );      // use after declaration and before definition
    return 0;
}

void foo( int x ) { // definition
    bar( x );       // use after declaration and before definition
}

void bar( int x ) { // definition
    cout << x;
}
4 голосов
/ 28 января 2009

Я думаю, что вы имеете в виду прототип функции .

Здесь вы определяете прототип функции в заголовочном файле , но определяете реализацию в исходном (.cpp) файле .

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

Только на этапе связывания функция «символ» разрешается с исходным файлом - если бы функция реализации не существовала на этом этапе, вы получите неразрешенный символ.

Вот пример:

Заголовочный файл библиотеки - library.h

// This defines a prototype (or signature) of the function
void libFunction(int a);

Файл библиотечного источника (.cpp) - library.cpp

// This defines the implementation (or internals) of the function
void libFunction(int a)
{
   // Function does something here...
}

Код клиента

#include "library.h"
void applicationFunction()
{
   // This function call gets resolved against the symbol at the linking stage
   libFunction();
}
2 голосов
/ 28 января 2009

Функции-члены класса объявлены в заголовке, который определяет интерфейс для класса. Этот заголовочный файл должен быть включен в верхнюю часть файла CPP, который включает в себя реализацию. Таким образом, не имеет значения, в каком порядке функции-члены определены в файле CPP, поскольку все объявления уже включены.

Из вашего вопроса я бы предположил, что вы рассматриваете возможность написания бесплатных функций. Вы можете использовать ту же технику для объявления свободных функций; тем не менее, я предостерегаю против слишком большого количества бесплатных функций.

2 голосов
/ 28 января 2009

Да. Поместите подпись функции в начало файла или в файл заголовка (.h).

Итак:

void OtherFunc(int a);

void SomeFunc()
{
    OtherFunc(123);
}

void OtherFunc(int a)
{
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...