C/C++ Why Does g++ Require -fpermissive for Default Arguments in Some Cases?

  • Thread starter Thread starter Peter P.
  • Start date Start date
  • Tags Tags
    Compiler Issues
AI Thread Summary
Using g++ on Linux can lead to compilation errors when default arguments are improperly specified in function declarations and definitions. The error arises when a function is declared with a default argument in both the prototype and the definition, which is not allowed. For example, in the `apply_surface` function, if the default argument is included in both places, it triggers an error unless the `-fpermissive` flag is used. The correct approach is to only specify default arguments in the prototype, typically found in a header file, while the definition in the source file should omit them. This distinction between declarations and definitions is crucial for avoiding such errors. Understanding this can help streamline the compilation process and reduce reliance on permissive flags.
Peter P.
Messages
23
Reaction score
0
I started using g++ and the command line on linux.

In one section of my code, I provide a default argument for a function parameter.
I'm just wondering why this sometimes brings up an error if i don't include -fpermissive
when I'm compiling everything.


As an example. This is the apply_surface function (taken from lazyfoo.net SDL tutorials):
Code:
 void apply_surface (int x, int y, SDL_Surface * source, SDL_Surface * destination,
  SDL_Rect * clip = NULL) {
    SDL_Rect offsets;
    offsets.x = x;
    offsets.y = y;

    SDL_BlitSurface (source, clip, destination, &offsets);
}

Even if i were to enter:
Code:
apply_surface (0, 0, backGround, screen);
or
Code:
apply_surface (0, 0, backGround, screen, NULL);

These will result in the following error:
main.cpp:81:103: error: default argument given for parameter 5 of ‘void applySurface(int, int, SDL_Surface*, SDL_Surface*, SDL_Rect*)’ [-fpermissive]
main.cpp:16:6: error: after previous specification in ‘void applySurface(int, int, SDL_Surface*, SDL_Surface*, SDL_Rect*)’ [-fpermissive]

But if I were to use this function (also with a default argument):
Code:
void function (int x, int y = 0) {
    std::cout << x << "\t" << y << std::endl;
}

Then it'll compile perfectly, without any errors.

So is this something that I will just have to deal with all the time, or is there some setting i can
change to make it not necessary to include -fpermissive when the error pops up (other than make files)?

Any help is appreciated, and I hope that i have been detailed enough in the explanation of my problem.

-Peter P.
 
Technology news on Phys.org
Hi Peter P! :smile:

You should not get those errors.
The fact that you do implies there is something wrong with your code (that is not apparent from what you show).

Did you perhaps specify
Code:
void apply_surface (int x, int y, SDL_Surface * source, SDL_Surface * destination,
  SDL_Rect * clip = NULL)
twice?
Once in the definition and once in a prototype declaration?

Normally you'd have a prototype declaration in a .h file with "= NULL", and you'd have the definition in a .cpp file without "= NULL".
 
Agree, most likely double declaration.

Unrelated, but do have define guards on your header files?
 
Ah, thanks for the help. It was the double declaration problem. I never know that you only had to specify default parameters in function prototypes and not the actual definition.
 
I don't know how people remember all the words like declarations and definitions; I was never that strong on it, and using dynamic-typed languages has blurred the line for me.
 
Thread 'Is this public key encryption?'
I've tried to intuit public key encryption but never quite managed. But this seems to wrap it up in a bow. This seems to be a very elegant way of transmitting a message publicly that only the sender and receiver can decipher. Is this how PKE works? No, it cant be. In the above case, the requester knows the target's "secret" key - because they have his ID, and therefore knows his birthdate.
Back
Top