Comandos e declarações em expressões

O GCC oferece várias extensões à linguagem, inclusive recursos que estão no ISO C99, mas não no C89 ou C++, sendo aceitos pelo GCC no modo C89 e em C++.

Vou dar uma olhada nessas extensões e ir postando para compartilhar com quem lê essa coisa. :)

Enfim, como está no título, a primeira extensão que veremos é essa.
Ela simplesmente permite criar um bloco com loops, switch, variáveis locais no lugar de uma expressão. Um uso interessante, seria em uma macro onde você não quer avaliar uma expressão mais de uma vez, como visto abaixo.

#define maxint(a,b) \
  ({ int _a = (a), _b = (b); _a > _b ? _a : _b; })

A última parte dentro do assim chamado compound statement, precisa ser uma expressão, o seu valor servirá como o valor inteiro da subexpressão.

Segue um simples exemplo usando a macro acima:

#include <stdio.h>
 
#define maxint(a,b) \
  ({ int _a = (a), _b = (b); _a > _b ? _a : _b; })
 
int main(int argc, char **argv) {	
	printf("%d %d\n", maxint(1+10, 10-1), maxint(100, 0));
	return 0;
}

Vale lembrar que se o código é compilado com -pedantic, as extensões providas pelo GCC não poderão ser usadas. Assim, para testar a disponibilidade desses recursos, você pode usar a pré-definida macro __GNUC__.

Compilando o código acima com -pedantic teremos:

In function ‘test’:
7: warning: ISO C forbids braced-groups within expressions
7: warning: ISO C forbids braced-groups within expressions

Fonte: Using the GNU Compiler Collection (GCC)

Legal, dessa eu não

Legal, dessa eu não sabia.
Na verdade, tem um *monte* de coisa do GCC que não sei e que o senhor vai explicar para nós aqui não é?
hehehe
Abraço ae!

Comment viewing options

Select your preferred way to display the comments and click "Save settings" to activate your changes.

Post new comment

The content of this field is kept private and will not be shown publicly.
  • Web page addresses and e-mail addresses turn into links automatically.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Lines and paragraphs break automatically.

More information about formatting options