The files are in following relation:
![]() |
| Double-inclusion scenario |
Let assume that this is the initial content of the files:
The content of b.h:
/*b.h*/
typedef enum
{
val1 = 1,
val2,
val3
}EValues;
The content of a.h:
/*a.h*/ #include"b.h" const int resource2 = val1+val2;
The content of main.c:
/*main.c*/
#include"a.h"
#include"b.h"
#include<stdio.h>
int main(void)
{
printf("val1: %d\nval2: %d\nResource %d",val1,val2,resource2);
return 0;
}
If you try to build the program you will encounter redeclaration errors:
../b.h:13:5: error: redeclaration of enumerator ‘val1’
../b.h:13:5: note: previous definition of ‘val1’ was here
../b.h:14:5: error: redeclaration of enumerator ‘val2’
../b.h:14:5: note: previous definition of ‘val2’ was here
../b.h:15:5: error: redeclaration of enumerator ‘val3’
../b.h:15:5: note: previous definition of ‘val3’ was here
../b.h:16:2: error: conflicting types for ‘EValues’
../b.h:16:2: note: previous declaration of ‘EValues’ was here
The solution for this problem is to use include guards.
#ifndef _HEADER_IDENTIFIER_ #define _HEADER_IDENTIFIER_ /*Header code*/ #endif
In order to make the program work corectly you will have to add an include guard to a.h and b.h:
The content of b.h:
/*b.h*/
#ifndef _B_H_
#define _B_H_
typedef enum
{
val1 = 1,
val2,
val3
}EValues;
#endif
The content of a.h:
/*a.h*/ #ifndef _A_H_ #define _A_H_ #include"b.h" const int resource2 = val1+val2; #endif
The content of main.c:
/*main.c*/
#include"a.h"
#include"b.h"
#include<stdio.h>
int main(void)
{
printf("val1: %d\nval2: %d\nResource %d",val1,val2,resource2);
return 0;
}
/*Output
val1: 1
val2: 2
Resource 3
*/


No comments:
Post a Comment
Got a question regarding something in the article? Leave me a comment and I will get back at you as soon as I can!