我有以下示例代码:
@interface S1 : NSObject
{
void(*fn_)();
}
@end
@implementation S1
- (void) set:(BOOL)f
{
if (f)
{
struct A { static void f() { std::cout << "1" << std::endl; } };
fn_ = A::f;
}
else
{
struct A { static void f() { std::cout << "2" << std::endl; } };
fn_ = A::f;
}
}
- (void) test { fn_(); }
@end
struct S2
{
void set(BOOL f)
{
if (f)
{
struct A { static void f() { std::cout << "1" << std::endl; } };
fn_ = A::f;
}
else
{
struct A { static void f() { std::cout << "2" << std::endl; } };
fn_ = A::f;
}
}
void test() { fn_(); }
void(*fn_)();
};
int main(int argc, const char * argv[])
{
auto s1 = [[S1 alloc] init];
[s1 set:TRUE];
[s1 test];
[s1 set:FALSE];
[s1 test];
S2 s2;
s2.set(TRUE);
s2.test();
s2.set(FALSE);
s2.test();
return 0;
}
它打印
1
1
1
2
但我期待
1
2
1
2
如果我将第二个结构的名称更改为不同的名称(例如“B”),则始终按预期工作。
不会出现任何警告,因此很难找出您的程序无法正常运行的原因。
这是我的无知还是llvm的错误?