我通过这个简单的演示重现了这个问题:
// bool_test_func.cpp
#include <stdio.h>
void func(bool* b) {
int a = (*b ? 0 : 1);
printf("%d\n", a); // EXPECT ether 0 or 1 here
}
// bool_test.cpp
void func(bool* b);
int main() {
int n = 128;
func((bool*)&n);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
-O0编译并运行:
g++ -g -O0 -Wall -o bool_test bool_test.cpp bool_test_func.cpp
mikewei@maclinux:~/testing/c++$ ./bool_test
0
Run Code Online (Sandbox Code Playgroud)
-O1编译并运行(意外结果):
g++ -g -O1 -Wall -o bool_test bool_test.cpp bool_test_func.cpp
mikewei@maclinux:~/testing/c++$ ./bool_test
129
Run Code Online (Sandbox Code Playgroud)
当我检查-O2 ASM代码时,我认为这是一个g ++错误,g ++的优化代码总是认为bool值是ether 1或0:
00000000004005e6 :
4005e6: 48 83 ec 08 sub …