Question

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?

Was it helpful?

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?

OTHER TIPS

The #import does matter -- C++ headers in an Objective-C++ source file should be included with #include. I think, though am not 100% sure, that the choice of include directive (#include vs #import) determines which preprocessor is used.

You could also reverse the declaration of the constants in the enum, since by default, members of an enum are associated with integers starting from 0.

Per comments, I'm wrong. Looks like you'll have to rewrite the enum. Sorry :(

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top