Yes it is bad practice if you are including that header in multiple areas. So what an include does is this: Whenever a compiler sees a #include, what it does is take all that code that is located in that area and insert it where that #include is. Now if you are compiling multiple cpp files together, or #including files that #include the same file. This inserts that chunk of code multiple times which increases the size of your program unnecessarily. Another good practice is using in the header files the #ifndef...#endif for large programs. It would look like this:
Say i have a person.h file coded as
#ifndef PERSON_H_
#define PERSON_H_
#include <stdio.h>
#include <stdlib.h>
typedef char NAME[41];
typedef struct date {
int month;
int day;
int year;
} DATE;
typedef struct person {
NAME name;
int age;
float height;
DATE bday;
} PERSON;
#endif
What this does is in the preprocessor stage of compilation, if it doesn't see PERSON_H_ defined, it creates it and associates everything between #define and #endif under that PERSON_H_ token. Now every time the preprocessor comes across a #include "person.h" it will check to see if PERSON_H_ exists already, if so it doesn't include the code again associated with PERSON_H_ again. This prevents against defining functions multiple times through header file inclusion and so forth.
It is good practice to define your function in the header file. These are called function prototypes. They tell the compiler what functions to expect. And the prototype is a little different than what you did, you do not need to declare the variable names, only the declarations. So your function prototype would be:
char *BoyerMoore_skip(char *, int );
instead of
char *BoyerMoore_skip(char *string, int strLength);