Jump to content

  • Log In with Google      Sign In   
  • Create Account

Inclusion Guards


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
12 replies to this topic

#1 Crusable   Members   -  Reputation: 594

Like
0Likes
Like

Posted 15 February 2013 - 01:03 AM

Hello, I was working on a project and it says that I have redefined a class, It took me 20 min to figure out that my inclusion guards where not working. I wrote them like so:
 
#ifndef IMAGE_HANDLER_H
#define IMAGE_HANDLER_H
 
class ImageHandler{
 
    //Handle stuff
};
 
#endif //IMAGE_HANDLER_H
 
 
Am I doing them wrong? Is there a better way to do them? Am I just crazy? Thank you in advance for your help.

Sponsor:

#2 Hodgman   Moderators   -  Reputation: 31800

Like
2Likes
Like

Posted 15 February 2013 - 01:08 AM

That looks correct to me. Can you post a larger example of why you think they're not working?

 

There is an alternate way to write them, but it's not necessarily better or worse, just different (see the linked thread for arguments for/against each way).



#3 Aressera   Members   -  Reputation: 1484

Like
0Likes
Like

Posted 15 February 2013 - 01:08 AM

Do you ever #undef anything? I can't think of why else you would be getting a redefinition error.


Edited by Aressera, 15 February 2013 - 01:13 AM.


#4 Crusable   Members   -  Reputation: 594

Like
0Likes
Like

Posted 15 February 2013 - 01:20 AM

That looks correct to me. Can you post a larger example of why you think they're not working?

 

There is an alternate way to write them, but it's not necessarily better or worse, just different (see the linked thread for arguments for/against each way).

 

I have a button class which includes the Image handler class and so does my System class(The system class contains the GameLoop). When I commented the Button code It worked.

 

 

 

Do you ever #undef anything? I can't think of why else you would be getting a redefinition error.

No.


Edited by Mathew Bergen, 15 February 2013 - 01:22 AM.


#5 frob   Moderators   -  Reputation: 22718

Like
3Likes
Like

Posted 15 February 2013 - 01:28 AM

Make sure the inclusion guards are unique across the project.  A common error is to simply copy a header from an existing header and forget to modify the inclusion guards.

 

 

As discussed in the other thread, that is one of the very good reasons to prefer the #pragma once element.


Check out my book, Game Development with Unity, aimed at beginners who want to build fun games fast.

Also check out my personal website at bryanwagstaff.com, where I write about assorted stuff.


#6 Crusable   Members   -  Reputation: 594

Like
0Likes
Like

Posted 15 February 2013 - 01:34 AM

I changed all my inclusion guards to pragma once and it works now. None of the names where the same so  I don't know why they where not working. 



#7 Pyrocute   GDNet+   -  Reputation: 288

Like
0Likes
Like

Posted 15 February 2013 - 03:13 AM

have you tried clean build ?



#8 BinaryPhysics   Members   -  Reputation: 294

Like
1Likes
Like

Posted 15 February 2013 - 07:00 AM

I'm going to be honest. I actually prefer 'pragma once' now. It's not 'standard' (before everyone has a go at me, I mean that it isn't written in the standards document that describes C++. Yes a lot of compilers support it but no-one is required to) so you can't write absolutely 100% portable code.

 

However, for my current project I use several other Visual Studio specific additions of pragma so I'm not concerned with portability. 'pragma once' has the added benefit of possibly speeding up the compile time as the compiler can refuse to open the file again.

 

That said if you wanted to go back to include guards Google's C++ programming guide dictates that include guard names are written as $(PROJECT_NAME)_$(FILE_DIR)_$(FILENAME)_H. I thought that was quite a simple and elegant method of generating unique guards.



#9 UnshavenBastard   Members   -  Reputation: 335

Like
1Likes
Like

Posted 15 February 2013 - 07:07 AM

Sigh, silly stuff like that reminds us how ancient that language really is ;-)

I'd use #pragma once, some people object, for it not being standard, but I haven't met a compiler in at least the past 5 years that didn't support it.


Flash ™ - The lightning bolt that hits *your* smooth user experience, too!

 

-----Bel Canto Society
save old not-yet-restored Opera recordings from rotting


#10 Dan Mayor   Crossbones+   -  Reputation: 1714

Like
0Likes
Like

Posted 15 February 2013 - 08:17 AM

Sigh, silly stuff like that reminds us how ancient that language really is ;-)

I'd use #pragma once, some people object, for it not being standard, but I haven't met a compiler in at least the past 5 years that didn't support it.

 

Here here, it's my opinion that other languages are approaching the performance barrier and are infinitely more productive but that's another conversation in and of itself.  For this particular question everyone seems to have addressed the possible problems so I'll just add a little tip concerning compiler issues that I have overcome in the past. First off, the "clean build"... Always ALWAYS do this.  Visual Studio especially has a nasty habit of ignoring to recompile files if it deems your changes to be superficial, many times you can change a single line of code and visual studio is like "eh it's close enough" and will roll with it.  NORMALLY this creates link time errors in the compilation process but has been known to cause random irrational errors.  Rule of thumb when compiling C++ code, if the error or warning reported doesn't immediately make sense run a complete clean re build (even delete the object and build files if necessary).  Other people may disagree with this next statement but it never hurts to try it yourself and see if it helps you.  The "Play" button on visual studio is not smart and doesn't always know what to do correctly.  It assumes that if something appears to already have been compiled that it is correct and ready to go and this leads to issues.  Right click the project and select clean build before you click play every time just to be safe.  Other than that barring any name clashes or scoping issues your code should have worked.


Digivance Game Studios Founder:

Dan Mayor - Dan@Digivance.com
 www.Digivance.com


#11 UnshavenBastard   Members   -  Reputation: 335

Like
0Likes
Like

Posted 15 February 2013 - 12:33 PM

Here here, it's my opinion that other languages are approaching the performance barrier and are infinitely more productive but that's another conversation in and of itself.  For this particular question everyone seems to have addressed the possible problems so I'll just add a little tip concerning compiler issues that I have overcome in the past. First off, the "clean build"... Always ALWAYS do this.  Visual Studio especially has a nasty habit of ignoring to recompile files if it deems your changes to be superficial, many times you can change a single line of code and visual studio is like "eh it's close enough" and will roll with it.

 

 


If you think MS VS is particularly bad about this, try using Qt Creator for a while, and you'll never again complain about VS :-D


Flash ™ - The lightning bolt that hits *your* smooth user experience, too!

 

-----Bel Canto Society
save old not-yet-restored Opera recordings from rotting


#12 Trienco   Crossbones+   -  Reputation: 2224

Like
0Likes
Like

Posted 15 February 2013 - 11:10 PM

So far and up to 2010, VS has never given me reason to complain, but after converting a project to 2012, some of the issues just aren't funny anymore. I make changes, compile, get an error because of a typo, fix it, compile... and it's ignoring the file and seems to use an old object file from several compiles ago, forcing me to either waste a lot of time on constant rebuilds or manually deleting the old files.

 

I really hope that's "just" an issue with converted projects or maybe something about this project in particular. On the other hand, I heard some people cursing about it at work as well.


f@dzhttp://festini.device-zero.de

#13 UnshavenBastard   Members   -  Reputation: 335

Like
0Likes
Like

Posted 16 February 2013 - 03:55 AM

So far and up to 2010, VS has never given me reason to complain, but after converting a project to 2012, some of the issues just aren't funny anymore. I make changes, compile, get an error because of a typo, fix it, compile... and it's ignoring the file and seems to use an old object file from several compiles ago, forcing me to either waste a lot of time on constant rebuilds or manually deleting the old files.

 

I really hope that's "just" an issue with converted projects or maybe something about this project in particular. On the other hand, I heard some people cursing about it at work as well.

 

Interesting. Haven't tried VS2012 yet. Maybe it's because the one major Eclipse guy joined the VS team. After taking care of Eclipse, he's going to make a mess out of VS, too... and some day, VS will be just as crappy as all those open source tool chains *smells communist conspiracy* :-D Well but seriously, I've heard some other weird things about 2012 and really wonder what MS is up to recently...
 


Flash ™ - The lightning bolt that hits *your* smooth user experience, too!

 

-----Bel Canto Society
save old not-yet-restored Opera recordings from rotting





Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS