我必须在Mac上使用Clang编译一个API,该Clang使用类似的构造:
#define TRUE 1
void func(int a) {
// ...
}
void func(double a) {
// ...
}
void func(float a) {
// ...
}
func(TRUE);
Clang抱怨对func()
的调用不明确,而MSVC和GCC则不明确。Clang有没有选择在这种情况下选择整数变体?
编辑:这是编译的原始输出
../../resource/_api/c4d_basedocument.cpp:263:52: error: conversion from 'int' to 'const GeData' is ambiguous
this->SetParameter(DescLevel(DOCUMENT_USERCHANGE),TRUE,DESCFLAGS_SET_DONTCHECKMINMAX);
^~~~
../../resource/_api/ge_sys_math.h:21:15: note: expanded from macro 'TRUE'
#define TRUE 1
^
../../resource/_api/c4d_gedata.h:97:3: note: candidate constructor
GeData(double n)
^
../../resource/_api/c4d_gedata.h:110:3: note: candidate constructor
GeData(LONG n)
^
../../resource/_api/c4d_gedata.h:116:3: note: candidate constructor
GeData(SReal n)
^
LONG
是积分型,SReal
是浮点型。
我花了更多的时间研究原始构建项目,发现我缺少了一个编译器选项。有趣的是,它只会产生额外的定义集,似乎可以解决"歧义"。
-include _api/ge_mac_flags.h
看起来像
#ifndef __GE_MAC_FLAGS__
#define __GE_MAC_FLAGS__
#define __MAC
#define __DEBUGGING__ // avoid conflicts with DebugAssert() definition for the Mac
#if __LP64__
#define __C4D_64BIT
#endif
#endif
解决它!