开发者

Multiple inclusion of header file c++

开发者 https://www.devze.com 2022-12-30 19:55 出处:网络
I have a problemregarding multiple inclusion of header file in C++ code. Say for example, I have three classes X, Y, Z. X and Y are derived from base class Z. And I want to create an instance of X in

I have a problem regarding multiple inclusion of header file in C++ code.

Say for example, I have three classes X, Y, Z. X and Y are derived from base class Z. And I want to create an instance of X in Y. The code will go like this.

class Z { …some code… };

class X: public Z { …some code… };  //here #include header of class Z added

class Y: public Z  //here开发者_JS百科 #include header of class Z added as well as of X class
{
private:
   X* mX;    //instance of X 

   …some code…
};

So in this multiple definition of all methods of base class arises. How can I cope with this problem?


Using "include guards" (Wikipedia link)

#ifndef MYHEADER_H
#define MYHEADER_H

// header file contents go here...

#endif // MYHEADER_H

This is idiomatic code, easily recognizable by any seasoned C and C++ programmer. Change MYHEADER_H to something specific to you, for example if the header defines a class named CustomerAccount, you can call the guard CUSTOMERACCOUNT_H.


In your specific case, have a separate header/source file for each class. The header file for the Z class will have an include guard:

#ifndef Z_H
#define Z_H

// Code of Z class

#endif Z_H

Now, the headers of both X and Y can include z.h safely - it will only really be included once in a .cpp file that includes both x.h and y.h and no duplication will occur.

Always keep in mind that in C and C++ what's really gets compiled are the source (.c or .cpp) files, not the header files. The header files are just "copy-pasted" by the preprocessor into the sources files that include them.


You can also use #pragma once preprocessor directive in your header files. (There's no need to bother about #ifndef, #define, #endif).


You use what are called include guards or header guards. They go something like this:

// within some_header.h
#ifndef SOME_HEADER_H
#define SOME_HEADER_H

// stuff goes here

#endif

Essentially, the first time around the macro hasn't been defined so everything inside is included. However, after the first time subsequent includes will have no effect.

The naming scheme, like all naming schemes, is completely arbitrary and up to you. I like to include the file name as a minimum, as I did above, in that fashion. I also include namespaces and project names in my real projects.

There are a couple of things to watch out for. You might be tempted to do things like this:

#define _SOME_HEADER_H__

To obfuscate it a bit. However, names that begin with an underscore followed by a capital letter, or contain double-underscores are reserved identifiers, and you cannot use them.


Here the simple way to avoid multiple header inclusion in the project.

//MYCLASS.h
#ifndef _MYCLASS_H_
#define _MYCLASS_H_

class CMyClass
{
public:
    CMyClass();
}

#endif //_MYCLASS_H_
0

精彩评论

暂无评论...
验证码 换一张
取 消