William
William

Reputation: 2191

How to check (via the preprocessor) if a C source file is being compiled as C++ code

The question title should say it all, but here's an example of what sort of thing I'm looking for:

#ifndef THE_IDENTIFIER_THAT_WOULD_INDICATE_BEING_COMPILED_AS_CPLUSPLUS

/*
 * Example of something that would matter.
 */
typedef enum _bool bool;
enum _bool { false, true };

#endif

What is the identifier? It's bugging me severely, as I know I've seen code that does this before.

I'm using GCC, by the way.

(I'm surprised I couldn't find a duplicate somewhere on SO. If someone else can find one, feel free to redirect me and close this as a dupe.)

Upvotes: 14

Views: 6305

Answers (6)

pmg
pmg

Reputation: 108988

The identifier is __cplusplus

#ifdef __cplusplus
#error NO C++ PLEASE
#endif

C23 6.10.10.1p3

The implementation shall not predefine the macro __cplusplus, nor shall it define it in any standard header."

C++11 16.8.1

The following macro names shall be defined by the implementation:

__cplusplus : The name __cplusplus is defined to the value 201103L when compiling a C++ translation unit.

Upvotes: 8

alecov
alecov

Reputation: 5171

The identifier you are looking for is __cplusplus, which can be used like this:

#ifdef __cplusplus
// Code being compiled as C++.
#endif

Upvotes: 1

James
James

Reputation: 9278

#ifdef __cplusplus

I think the file extension matters too, if the C++ compiler is given a .c file it will compile it as C code. i have nothing to back this up though.

Upvotes: 2

nmichaels
nmichaels

Reputation: 51029

#ifdef __cplusplus

Upvotes: 2

Jerry Coffin
Jerry Coffin

Reputation: 490623

#ifdef __cplusplus

with a few really ancient compilers (early versions of cfront and a couple of ports) it was c_pluplus, IIRC.

Upvotes: 3

frast
frast

Reputation: 2740

#ifndef __cplusplus

If I remember correctly.

Upvotes: 17

Related Questions