How are C++ include guards typically named? I tend to see this a lot:
#ifndef FOO_H
#define FOO_H
// ...
#endif
However, I don't think that's very intuitive. Without seeing the file name it's difficult to tell what FOO_H
is there for and what its name refers to.
What's considered best practice?
Usually people do that by file name so that each file's code only gets compiled and added once. You could make FOO_H whatever you want, but almost everything I've ever coded or seen has used the file name. Just make sure it's unique because you don't want your FOO_H conflicting with someone else's FOO_H.
I personally follow Boost's recommendation. It's perhaps one of the largest collection of C++ libraries of good quality around and they don't have problem.
It goes like:
which is:
_[A-Z]
or containing__
is not)INCLUDED
you're spoiling for a fight)I've read about GUID but those look weird.
And obviously I'd rather than all compilers implement
#pragma once
(or better,#pragma multiple
and "once" be the default behavior...)Look at the code that #include's your header.
If it is something like:
mylib/myheader.h
is already a unique name. Just capitalize and replace / and . with _If you have two headers on your include path with the same name relative to the include path, you already have a collision at that level.
I normally use something like
FOO_H_INCLUDED_
. A few (Microsoft) headers have what looks a lot like a string representation of a GUID, but I've never needed anything quite that elaborate.Taken directly from google's style guide:
I use this style in my own projects.
As others mentioned before, a very common convention is to use the uppercase version of the name, and the dot replaced by an underscore: foo.h -> FOO_H
However, this can lead to name collisions with simple and/or common names. For this reason, autogenerated header like the stdafx.h in non-empty Visual C C++ projects append some random string, like:
http://www.random.org/strings/ is a useful random generator for this.
Also, if the file is part of some submodule, or its contents reside in one specific namespace, I tend to add that to the guard too: