2i
gcc
karmaşık bir tamsayı için bir uzantıdır, karekökün iki katı saf sanal bir sayıdır -1
. Bu uzantı da tarafından desteklenmektedir clang
.
İle derlemenizin gcc 5.4.0
postalanmış derleme çıktısını oluşturması biraz şaşırtıcıdır :
- Üzerinde Derleme http://gcc.godbolt.org/# Ben bir derleme hatası alıyorum
gcc
5.3.0: http://gcc.godbolt.org/#
: error: cannot convert '__complex__ int' to 'int' in return
.
- İşlev için gönderilen derleme kodu
foo
yanlış: geri dönmüyor 0
. Karmaşık tamsayı sabiti dönüştürme 2i
için int
gerçek bir kısmını dönmelidir 0
.
Tersine, clang
3.7 ile, bir uyarı olmadan derler ve optimum kod üretir, ancak elbette beklediğiniz gibi değildir:
foo(int): # @foo(int)
xorl %eax, %eax
retq
Bu sözdizimi, diğer soneklerle herhangi bir sırada birleştirilebilir. Aşağıdaki kodu derlemek clang -Weverything
bana uygun uyarıları veriyor 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;
}
Bu çıktıyı benim ortamımda üretir:
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
Sonuncuyu sözdizimi renklendirme düzenleyicinizle deneyin ;-)