Чи слід вказувати значення аргументів функції за замовчуванням у заголовках або вихідних файлах .cpp?


78

Я щось нове в C ++. У мене проблеми з налаштуванням заголовків. Це з functions.h

extern void apply_surface(int, int, SDL_Surface *, SDL_Surface *,SDL_Rect *);

І це визначення функції з functions.cpp

void
apply_surface(int x, int y, SDL_Surface * source, SDL_Surface *
destination,SDL_Rect *clip = NULL)
{
    ...
}

І ось як я використовую це в main.cpp

#include "functions.h"
int
main (int argc, char * argv[])
{
    apply_surface(bla,bla,bla,bla); // 4 arguments, since last one is optional.
}

Але це не компілюється, оскільки main.cpp не знає, що останній параметр необов’язковий. Як я можу зробити цю роботу?


ви пробували додати до заголовка?
PlasmaHH

Відповіді:


119

Ви робите декларацію (тобто у файлі заголовка - functions.h) містити необов’язковий параметр, а не визначення ( functions.cpp).

//functions.h
extern void apply_surface(int, int, SDL_Surface *, SDL_Surface *,SDL_Rect * clip = NULL);

//functions.cpp
void apply_surface(int x, int y, SDL_Surface * source, SDL_Surface *
destination,SDL_Rect *clip /*= NULL*/)
{
    ...
}

7
Для уточнення, декларація є частиною заголовка.
Björn Pollex

Дякую, а також @ BjörnPollex! Це мені допомогло.
M.Ionut,

це те, що я завжди плутаю, налаштовуючи порожній додаток c ++, мені дійсно потрібно почати використовувати налаштування додатка за замовчуванням
clockw0rk

13

Значення параметра за замовчуванням має бути в декларації функції (functions.h), а не у визначенні функції (function.cpp).


2

Використання:

extern void apply_surface(int, int, SDL_Surface *, SDL_Surface *,SDL_Rect * = NULL);

(зауважте, я не можу це перевірити тут; поруч немає компілятора).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.