# Inclusion Guards

This topic is 1795 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

## Recommended Posts

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.

##### Share on other sites

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

Edited by Aressera

##### Share on other sites

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).

##### Share on other sites

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

##### Share on other sites

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.

##### Share on other sites

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.

##### Share on other sites

have you tried clean build ?

##### Share on other sites

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.

##### Share on other sites

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.

##### Share on other sites

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.

##### Share on other sites

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.

##### Share on other sites

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.

##### Share on other sites

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...

##### Share on other sites

This topic is 1795 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.