2igcc복소수 정수 리터럴 의 확장으로,의 제곱근의 두 배인 순수 허수입니다 -1. 이 확장은에서도 지원됩니다 clang.
로 컴파일 gcc 5.4.0하면 게시 된 어셈블리 출력 이 생성 된다는 것은 다소 놀랍습니다 .
- 에 컴파일 http://gcc.godbolt.org/# 것은 내가에서 컴파일 오류가
gcc5.3.0 : http://gcc.godbolt.org/#: error: cannot convert '__complex__ int' to 'int' in return.
- 함수
foo에 대해 게시 된 어셈블리 코드 가 올바르지 않습니다.을 반환하지 않습니다 0. 복잡한 정수 상수 2i를로 변환하면 int실수 부분을 반환해야합니다 0.
반대로 clang3.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
구문 색상 편집기로 마지막 시도 ;-)