From d9792b3e5973caca68126913e969818a25ff7cf8 Mon Sep 17 00:00:00 2001 From: Alexey Kozhevnikov Date: Thu, 18 Oct 2018 08:42:51 -0700 Subject: [PATCH] Exclude cpp equality operators from `extern "C"` Summary: `extern "C"` disables name mangling, hence input parameter types does not influence the name. That makes it impossible to have several equality operators with `extern "C"` linkage (for different types). One such operator is defined in Windows SDK, in `guiddef.h`. It in turn is included in `winnt.h` inside `extern "C" { ... }` block. Trying to compile file which both is dependent both on `winnt.h` and `Yoga.h` results in: ``` Yoga.h(50): error C2733: 'operator ==': second C linkage of overloaded function not allowed guiddef.h(192): note: see declaration of 'operator ==' ``` In general it doesn't make much sense to have cpp specific operator to have `extern "C"` linkage, so the change doesn't introduce any controlling flag (mangling on/off). Note that it's breaking binary compatibility and yoga library should be rebuilt if those operators are used. Reviewed By: milend Differential Revision: D10418395 fbshipit-source-id: 2f1cccff26165e638b9a07eece07d94fccfa5e5a --- ReactCommon/yoga/yoga/Yoga.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ReactCommon/yoga/yoga/Yoga.h b/ReactCommon/yoga/yoga/Yoga.h index f15b4e469b..d5da362dec 100644 --- a/ReactCommon/yoga/yoga/Yoga.h +++ b/ReactCommon/yoga/yoga/Yoga.h @@ -47,9 +47,13 @@ extern const YGValue YGValueAuto; #ifdef __cplusplus +YG_EXTERN_C_END + extern bool operator==(const YGValue& lhs, const YGValue& rhs); extern bool operator!=(const YGValue& lhs, const YGValue& rhs); +YG_EXTERN_C_BEGIN + #endif typedef struct YGConfig* YGConfigRef;