Check If Bool Is Defined in Mixed C/C++

So I'm having issues with some code that I've inherited. This code was building fine in a C-only environment, but now I need to use C++ to call this code. The header problem.h contains:

#ifndef _BOOL
typedef unsigned char bool;
static const bool False = 0;
static const bool True = 1;
#endif

struct astruct
{
  bool myvar;
  /* and a bunch more */
}

When I compile it as C++ code, I get error C2632: 'char' followed by 'bool' is illegal

I get the same error if I wrap the #include "problem.h" in extern "C" { ... } (which I don't understand, because there should be no keyword bool when compiling as C?)

I tried removing the block from #ifndef _BOOL to #endif, and compiling as C++, and I get errors:

error C2061: C requires that a struct or union has at least one member
error C2061: syntax error: identifier 'bool'

I just don't understand how the C++ compiler is complaining about a redefinition of bool, yet when I remove the redefinition and try to just use bool to define variables, it doesn't find anything.

Any help is greatly appreciated.

1

4 Answers

Because bool is a basic type in C++ (but not in C), and can't be redefined.

You can surround your code with

#ifndef __cplusplus
typedef unsigned char bool;
static const bool False = 0;
static const bool True = 1;
#endif
3

You can use C99's bool:

#ifndef __cplusplus
#include <stdbool.h>
#endif

bool myBoolean; // bool is declared as either C99's _Bool, or C++'s bool data type.

Why should you use this?

For compatibility with other C99 code. _Bool is commonly used in C99 Code, and is very useful. It also grants you the ability to have a boolean datatype without the need to typedef a lot of stuff, as behind the scenes, _Bool is a datatype defined by the compiler.

5

You should use the __cplusplus macro:

#ifndef __cplusplus
#ifndef _BOOL
typedef unsigned char bool;
static const bool False = 0;
static const bool True = 1;
#endif
#endif 

Check out this link to the C++ FAQ for further details.

I had this "'char' followed by 'bool' is illegal" problem in VS also. The problem for me was I did not end my class declaration with a semi-colon- which I was not expecting to be the issue as this was in the header file and the problem was coming up in the cpp file! eg:

class myClass
{

}; // <-- put the semi colon !!
3

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Elena Rostova

Elena Rostova

Lead Health, Wellness & Medical Journalist

Elena Rostova holds a Master's degree in Public Health Journalism. She covers groundbreaking medical research, holistic wellness trends, mental health awareness, and nutritional science.

Share this article
Twitter Facebook Pinterest