2i
是gcc
复数整数文字的扩展,它是的平方根的两倍的纯虚数-1
。该扩展也受支持clang
。
进行编译gcc 5.4.0
会产生发布的程序集输出,这有点令人惊讶:
- 编译上http://gcc.godbolt.org/#我从得到一个编译错误
gcc
5.3.0: :。http://gcc.godbolt.org/#
error: cannot convert '__complex__ int' to 'int' in return
- 发布的功能汇编代码
foo
不正确:它不会返回0
。将复数整数常量转换2i
为int
应该返回其实部0
。
相反,在clang
3.7中,它会在没有警告的情况下进行编译并生成最佳代码,但当然不会达到您的期望:
foo(int): # @foo(int)
xorl %eax, %eax
retq
该语法可以以任何顺序与其他后缀组合。编译下面的代码clang -Weverything
会给我适当的警告warning: imaginary constants are a GNU extension [-Wgnu-imaginary-constant]
:
#include <stdio.h>
int main() {
printf("sizeof(2i) = %zd\n", sizeof(2i));
printf("sizeof(2ui) = %zd\n", sizeof(2ui));
printf("sizeof(2li) = %zd\n", sizeof(2li));
printf("sizeof(2lli) = %zd\n", sizeof(2lli));
printf("sizeof(2.i) = %zd\n", sizeof(2.i));
printf("sizeof(2.fi) = %zd\n", sizeof(2.fi));
printf("sizeof(2e0fi) = %zd\n", sizeof(2e0fi));
printf("sizeof(2e0i) = %zd\n", sizeof(2e0i));
printf("sizeof(2il) = %zd\n", sizeof(2il));
printf("sizeof(2ill) = %zd\n", sizeof(2ill));
printf("sizeof(2.if) = %zd\n", sizeof(2.if));
return 0;
}
它在我的环境中产生以下输出:
sizeof(2i) = 8
sizeof(2ui) = 8
sizeof(2li) = 16
sizeof(2lli) = 16
sizeof(2.i) = 16
sizeof(2.fi) = 8
sizeof(2e0fi) = 8
sizeof(2e0i) = 16
sizeof(2il) = 16
sizeof(2ill) = 16
sizeof(2.if) = 8
使用语法着色编辑器尝试最后一个 ;-)