c++objective-cc-preprocessorname-clash

Mixing Objective-C and C++ code


I have an Objective-C/C++ application which uses functionality that is provided by a C++ library.

One of the C++ classes includes an enum like this:

class TheClass
{
public:
[...]

enum TheEnum
{
    YES,
    NO,
};

[...]
};

Including (using #import -if that matters-) a header file with the above class declaration in an Objective-C/C++ source file (*.mm) will make the compile fail since the preprocessor will replace "YES" by the term "(BOOL) 1" (and likewise "NO" by "(BOOL) 0").

Is there a way to fix that without renaming the values of the enum?


Solution

  • YES and NO are predefined constants in Objective-C, declared in the objc.h header.

    You should be able to prevent the preprocessor to expand the "YES" and "NO" macro's. This can be done by locally #undeffing them.

    But technically, if you're using a language keyword as an identifier, you can expect trouble. You won't write a class containing a member called MAX_PATH, would you?