Upload
francisco-cunha-neto
View
212
Download
0
Embed Size (px)
DESCRIPTION
GCC - o básico
Citation preview
GCC - o básico
Vamos começar com o compilador...Eu espero que vocês saibam como compilar um código "na mão", isto é, sem "ctrl+f9" do seu IDE.Para aqueles qu não sabem, a sintaxe do gcc é:
gcc [opções][arquivos][-o saída (opcional)]
Algumas das opções mais utilizadas:-Idir --> adiciona um diretório "dir" onde o compilador procurará por #includes
-Ldir --> adiciona um diretório "dir" onde o linker procurará por bibliotecas
-larquivo --> Adiciona um bilioteca a linkagem (*.a, *.lib, *.so, *.dll...), se não for uma biblioteca "padrão", deve-se indicar o diretório onde ela se encontra, com -LNão é preciso escrever o "lib" nem a extensão do arquivo, suponha que você quer incluir a bilbioteca /home/eu/projetos/libteste.soO seu comando ficaria: gcc -L/home/eu/projetos -lteste
-c --> apenas compila os objetos, não efetua a linkagem
-g --> compila os objetos em debug mode, adicionando informações que permitem a utilização de um debugger.
-Wopção --> SUA OPÇÃO PREFERIDA!!!, habilita os warnings (avisos) do compilador, são eles que te avisam onde estão os erros do seu código, te dizem até a linha... que moleza!
Acho que para já está bom.
Compilando um código
código: http://codepad.org/eOqb8tH6
#include <stdio.h>#include <stdlib.h>
typedef int TYPE;
typedef struct node{
TYPE data;struct node *next;
} node
//Acho que os nomes das funções são bem explicativos...void add_node(node** root, TYPE value);
void remove_node(node** root, node* n);node* find_node(node* root, TYPE value);void destroy_list(node** root);void print_list(node* root);
int main(){node* list = NULL;
add_node(&list, 1);add_node(&list, 2);add_node(&list, 3);add_node(&list, 4);add_node(&list, 5);add_node(&list, 6);add_node(&list, 7)add_node(&list, 8);add_node(&list, 9);
print_list(list);
fprintf(stdout, "\nVamos agora apagar alguns nós (7 e 8)...\n\n");
remove_node(list, find_node(list, 7));remove_node(&list, find_node(list, 8));
print_list(list);
fprintf(stdout, "\nVamos liberar a lista inteira...\n\n");
destroy_list(&list);
fprintf(stdout, (list == NULL)?("Lista liberada\n"):("algo correu mal...\n"));
return 0;
}
void add_node(node** root, TYPE value){
if ((*root) == NULL){
(*root) = (node*)malloc(sizeof(node));(*root)->data = value;(*root)->next = NULL;return;
}
node *curr = (*root);node *newnode = (node*)malloc(sizeof(node));
newnode->data = value;newnode->next = NULL;
#include <stdio.h>#include <stdlib.h>
typedef int TYPE;
typedef struct node{
TYPE data;struct node *next;
} node
//Acho que os nomes das funções são bem explicativos...void add_node(node** root, TYPE value);void remove_node(node** root, node* n);node* find_node(node* root, TYPE value);void destroy_list(node** root);void print_list(node* root);
int main(){node* list = NULL;
add_node(&list, 1);add_node(&list, 2);add_node(&list, 3);add_node(&list, 4);add_node(&list, 5);add_node(&list, 6);add_node(&list, 7)add_node(&list, 8);add_node(&list, 9);
print_list(list);
fprintf(stdout, "\nVamos agora apagar alguns nós (7 e 8)...\n\n");
remove_node(list, find_node(list, 7));remove_node(&list, find_node(list, 8));
print_list(list);
fprintf(stdout, "\nVamos liberar a lista inteira...\n\n");
destroy_list(&list);
fprintf(stdout, (list == NULL)?("Lista liberada\n"):("algo correu mal...\n"));
return 0;
}
void add_node(node** root, TYPE value){
if ((*root) == NULL){
(*root) = (node*)malloc(sizeof(node));(*root)->data = value;(*root)->next = NULL;return;
}
node *curr = (*root);node *newnode = (node*)malloc(sizeof(node));
newnode->data = value;newnode->next = NULL;
while (curr->next != NULL)curr = curr->next;
curr->next = newnode;}
void remove_node(node** root, node* n){node *curr = (*root);
if (n == NULL)return;
if ((*root) == n){
(*root) = (*root)->next;free(curr);return;
}
while (curr->next != n){
if (curr = NULL){
fprintf(stderr, "Node: not found in the list\n");
return;}
curr = curr->next;}
curr->next = n->next;
free(n);}
node *find_node(node* root, TYPE value){node *curr = root;
for (;; curr = curr->next){
if (curr->data == value)return curr;
if (curr == NULL){
fprintf(stderr, "value: %d not found in the list\n", value);
return NULL;}
}}
void destroy_list(node** root){node *curr = root;
while (curr != NULL){
curr = (*root);(*root) = (*root)->next;
free(curr);}
}
void print_list(node* root){node *curr = root;
while (curr != NULL){
fprintf(stdout, "[%x] %d\n", curr, curr->data);curr = curr->next;
}}
O que o compilador me disse:
Quote
victor@matrix:~/Desktop/tuto$ gcc -Wall -Wextra -g code.ccode.c:13: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘void’code.c:14: error: expected ‘)’ before ‘*’ tokencode.c:15: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘*’ tokencode.c:16: error: expected ‘)’ before ‘*’ tokencode.c:17: error: expected ‘)’ before ‘*’ tokencode.c: In function ‘main’:code.c:22: error: ‘node’ undeclared (first use in this function)code.c:22: error: (Each undeclared identifier is reported only oncecode.c:22: error: for each function it appears in.)code.c:22: error: ‘list’ undeclared (first use in this function)code.c:24: warning: implicit declaration of function ‘add_node’code.c:31: error: expected ‘;’ before ‘add_node’code.c:34: warning: implicit declaration of function ‘print_list’code.c:38: warning: implicit declaration of function ‘remove_node’code.c:38: warning: implicit declaration of function ‘find_node’code.c:45: warning: implicit declaration of function ‘destroy_list’
code.c: At top level:code.c:53: error: expected ‘)’ before ‘*’ tokencode.c:75: error: expected ‘)’ before ‘*’ tokencode.c:105: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘*’ tokencode.c:122: error: expected ‘)’ before ‘*’ tokencode.c:135: error: expected ‘)’ before ‘*’ token
Notem nas opções que utilizei para compilar o código:-Wall: dizendo o compilador para mostrar TODOS os warnings-Wextra: pedindo ainda os warnings extra-g: debug mode.
E notem que o compilador me falou TUDO que estava errado no código...A nomenclatura é muito simples:
<nome_do_arquivo>:<número_da_linha>:<error ou warning>: o que você fez de errado
Depois de seguir as mensagens dele, temos outro código:http://codepad.org/tlQGsL0t
#include <stdio.h>#include <stdlib.h>
typedef int TYPE;
typedef struct node{
TYPE data;struct node *next;
} node;
//Acho que os nomes das funções são bem explicativos...void add_node(node** root, TYPE value);void remove_node(node** root, node* n);node* find_node(node* root, TYPE value);void destroy_list(node** root);void print_list(node* root);
int main(){node* list = NULL;
add_node(&list, 1);add_node(&list, 2);add_node(&list, 3);add_node(&list, 4);add_node(&list, 5);add_node(&list, 6);add_node(&list, 7);add_node(&list, 8);add_node(&list, 9);
print_list(list);
fprintf(stdout, "\nVamos agora apagar alguns nós (7 e 8)...\n\n");
remove_node(&list, find_node(list, 7));remove_node(&list, find_node(list, 8));
print_list(list);
fprintf(stdout, "\nVamos liberar a lista inteira...\n\n");
destroy_list(&list);
fprintf(stdout, (list == NULL)?("Lista liberada\n"):("algo correu mal...\n"));
return 0;
}
void add_node(node** root, TYPE value){
if ((*root) == NULL){
(*root) = (node*)malloc(sizeof(node));(*root)->data = value;(*root)->next = NULL;return;
}
node *curr = (*root);node *newnode = (node*)malloc(sizeof(node));
newnode->data = value;newnode->next = NULL;
while (curr->next != NULL)curr = curr->next;
curr->next = newnode;}
void remove_node(node** root, node* n){node *curr = (*root);
if (n == NULL)return;
if ((*root) == n){
(*root) = (*root)->next;free(curr);return;
}
while (curr->next != n){
if (curr == NULL){
fprintf(stderr, "Node not found in the list\n");
return;}
curr = curr->next;}
curr->next = n->next;
free(n);}
node *find_node(node* root, TYPE value){node *curr = root;
for (;; curr = curr->next){
if (curr->data == value)return curr;
if (curr == NULL){
fprintf(stderr, "value: %d not found in the list\n", value);
return NULL;}
}}
void destroy_list(node** root){node *curr = (*root);
while (curr != NULL){
curr = (*root);(*root) = (*root)->next;
free(curr);}
}
void print_list(node* root){node *curr = root;
while (curr != NULL){
fprintf(stdout, "[%x] %d\n", (unsigned int)curr, curr->data);
curr = curr->next;}
}
Ao compilar esse novo código.... tcharaaaam! nenhum erro, nem warning! maravilha!!
Mas e ao executar o programa?