2i
est gcc
extension d'un complexe entier littéral, un imaginaire pur numéro deux fois la racine carrée de l' -1
. Cette extension est prise en charge par clang
.
Il est assez surprenant que votre compilation avec gcc 5.4.0
produit le posté assemblée de sortie:
- Compilation sur http://gcc.godbolt.org/# j'obtiens une erreur de compilation à partir de
gcc
5.3.0: http://gcc.godbolt.org/#
: error: cannot convert '__complex__ int' to 'int' in return
.
- Posté le code assembleur de la fonction
foo
est incorrect: il ne renvoie pas d' 0
. La conversion du complexe entier constant 2i
de int
doit retourner sa partie réelle 0
.
À l'inverse, clang
3.7, il compile sans avertissement et génère optimale de code, mais bien sûr pas ce que vous attendez:
foo(int): # @foo(int)
xorl %eax, %eax
retq
Cette syntaxe peut être combiné avec d'autres suffixes dans n'importe quel ordre. En compilant le code ci-dessous avec clang -Weverything
donne-moi des mises en garde appropriées warning: imaginary constants are a GNU extension [-Wgnu-imaginary-constant]
:
#include <stdio.h>
int main() {
/* complex integer literals */
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));
/* complex floating point literals */
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));
/* alternate order */
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;
}
Il produit de cette sortie dans mon environnement:
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
Essayez la dernière avec votre coloration de la syntaxe de l'éditeur ;-)