2ilà gccphần mở rộng cho một chữ số nguyên phức, một số thuần ảo gấp đôi căn bậc hai của -1. Phần mở rộng này cũng được hỗ trợ bởi clang.
Điều hơi ngạc nhiên là quá trình biên dịch của bạn với gcc 5.4.0tạo ra kết quả lắp ráp đã đăng:
- Biên dịch trên http://gcc.godbolt.org/# Tôi gặp lỗi biên dịch từ
gcc5.3.0 http://gcc.godbolt.org/#:: error: cannot convert '__complex__ int' to 'int' in return.
- Mã lắp ráp đã đăng cho chức năng
fookhông chính xác: nó không trả về 0. Chuyển đổi hằng số nguyên phức 2ithành intsẽ trả về phần thực của nó 0.
Ngược lại, với clang3.7, nó biên dịch mà không có cảnh báo và tạo ra mã tối ưu, nhưng tất nhiên không phải những gì bạn mong đợi:
foo(int): # @foo(int)
xorl %eax, %eax
retq
Cú pháp này có thể được kết hợp với các hậu tố khác theo bất kỳ thứ tự nào. Việc biên dịch mã bên dưới với clang -Weverythingcác cảnh báo thích hợp cho tôi 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;
}
Nó tạo ra đầu ra này trong môi trường của tôi:
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
Hãy thử cái cuối cùng với trình chỉnh sửa màu cú pháp của bạn ;-)