我最近一直在使用Clang
,并且在解析显式强制转换时总会出现这种小好奇心。
明确我的观点,这里有一些基本代码:
int main(){
int my_int;
float my_float;
my_int = (int) my_float;
return 0;
}
当然,您希望将my_int = (int) my_float;
解析为CStyleCastExpr,CastKind为CK_FloatingToIntegral
,但事实并非如此,事实上,演员的性质存储在ImplicitCastExpr内,CStyleCastExpr
保持NoOp
性质。
以下是此代码的匹配AST转储:
|-DeclStmt 0x2eb3528 <line:3:1, col:11>
| `-VarDecl 0x2eb34d0 <col:1, col:5> my_int 'int'
|-DeclStmt 0x2eb35a8 <line:4:1, col:15>
| `-VarDecl 0x2eb3550 <col:1, col:7> my_float 'float'
|-BinaryOperator 0x2eb3678 <line:5:1, col:16> 'int' lvalue '='
| |-DeclRefExpr 0x2eb35c0 <col:1> 'int' lvalue Var 0x2eb34d0 'my_int' 'int'
| `-CStyleCastExpr 0x2eb3650 <col:10, col:16> 'int' <NoOp>
| `-ImplicitCastExpr 0x2eb3638 <col:16> 'int' <FloatingToIntegral>
| `-ImplicitCastExpr 0x2eb3620 <col:16> 'float' <LValueToRValue>
| `-DeclRefExpr 0x2eb35e8 <col:16> 'float' lvalue Var 0x2eb3550 'my_float' 'float'
`-ReturnStmt 0x2eb36c0 <line:6:1, col:8>
`-IntegerLiteral 0x2eb36a0 <col:8> 'int' 0
似乎有点令人困惑,因为ImplicitCastExpr
对我来说,只有在发生意外投射时才会被识别(参见下面的代码)。
int main(){
int my_int;
float my_float;
// implicit cast from float to int
my_int = my_float;
return 0;
}
你能对此有一些解释吗?
答案 0 :(得分:3)
这似乎是clang实施的副作用:
http://comments.gmane.org/gmane.comp.compilers.clang.devel/17369
生成强制转换节点的源代码文件是:
https://github.com/llvm-mirror/clang/blob/master/lib/Sema/SemaCast.cpp