Category Archives: CPP

C, C++: cannot open shared object file

As bibliotecas compartilhadas são carregadas no início da execução de um programa. No Linux, o dynamic loader procura pelas bibliotecas em /lib e /usr/lib. Caso a biblioteca não esteja presente neste caminho, recebemos uma mensagem de erro parecida com a … Continue reading

Posted in C, CPP, Linux | Tagged , , , , , , , | 7 Comments

C, C++: Dupla negação para conversão em booleano

Em C não existe um tipo nativo booleano, temos 0 como falso e tudo diferente de 0 é verdadeiro. Em C++ existe o tipo booleano, onde verdadeiro e falso correspondem respectivamente a 0 e 1. Uma forma de fazer um … Continue reading

Posted in C, CPP | Tagged , , , , , , | 1 Comment

C, C++: Vetores de tamanho zero

Um recurso bastante útil do GCC (apenas) são vetores de tamanho zero. O uso é permitido apenas como último elemento de uma estrutura de dados. struct pessoa { int idade; char nome[0]; }; printf(“%d\n”, sizeof(struct pessoa)); // Imprime “4” Note … Continue reading

Posted in C, CPP | Tagged , , , , , , | 7 Comments

C, C++: Cuidado com funções definidas como macros

Imagine uma função definida em uma macro que faça a potência de dois de um determinado número. Ela poderia ser definida da seguinte forma: #define quadrado(n) \ n * n Acontece que o comportamento, dependendo dos parâmetros, nem sempre é … Continue reading

Posted in C, CPP | Tagged , , , , , | 8 Comments

C, C++: Usando a seção de dados

As variáveis da pilha de execução, são automaticamentes desalocadas quando a mesma retorna. No caso do exemplo a seguir, o retorno da função teste() é o endereço de memória da string “Teste123” (ou seja, para onde str aponta e não … Continue reading

Posted in C, CPP | Tagged , , , , , , , , | 1 Comment

C, C++: Banir funções usando o pré-processador

Quem usa o GCC pode tirar vantagem do pré-processador para banir de vez do código algumas funções consideradas maléficas como gets() e sprintf(), por exemplo. Basta acrescentar no seu código a seguinte linha: #pragma GCC poison gets sprintf Um erro … Continue reading

Posted in C, CPP | Tagged , , , , , , | 1 Comment

C++: hash_set, hash_map

Apesar dos templates para hash_set e hash_map não serem padronizados, ambos são relativamente comuns, estando disponíveis tanto na implementação GNU (ie, no GCC) quanto no Visual C++ no Windows. Existem algumas diferenças, como o namespace um pouco mais escondido no … Continue reading

Posted in CPP | Tagged , , , , , , | Comments Off on C++: hash_set, hash_map

C++: Ponteiro para métodos/funções sobrecarregadas

Para obter ponteiros a métodos ou funções sobrecarregadas, como exemplo: class Foo { public: void bla(int a); int bla() const; }; Se tentarmos usar o nome da função diretamente, o compilador não saberá a qual dos métodos você se refere. … Continue reading

Posted in CPP | Tagged , , , | 3 Comments

C, C++: Obter macros definidas pelo pré-processador

Palavras-chave: C, pré-processador, macros, macro, define, gcc O pré-processador do GCC define uma série de macros por default. Muitas delas podem lhe ser útil, caso se deseje que um determinado bloco de código seja compilado para apenas uma determinada arquitetura, … Continue reading

Posted in C, CPP | Comments Off on C, C++: Obter macros definidas pelo pré-processador

C, C++: Fechar a saída padrão e de erro (stdout, stderr)

Uma forma de impedir que seu programa imprima na tela, seja por linkar com uma biblioteca que abusa da verbosidade ou para garantir que um daemon não polua seu terminal quando for para background, é fechando a saída padrão (stdout) … Continue reading

Posted in C, CPP | Tagged , , , , , | 4 Comments

C, C++: Parâmetro não utilizado

Palavras-chave: warning, unused parameter, variable Em alguns casos temos que implementar uma função (na maioria dos casos uma callback) cujo o protótipo já é definido pela API utilizada. Alguns parâmetros podem ser desnecessários, mas geram warnings de compilação caso não … Continue reading

Posted in C, CPP | 4 Comments

C, C++: Alocação dinâmica na pilha

Palavras-chave: non-constant initializers, dynamic stack allocation Muitas vezes alocamos memória para um buffer baseado em um tamanho que é passado como parâmetro para a função. Como no seguinte exemplo: void foobar (size_t size) { char *buffer = malloc(size * 2); … Continue reading

Posted in C, CPP | 6 Comments

C, C++: Funções com número variável de parâmetros (stdargs)

Palavras-chave: C, C++, varargs, argumentos variáveis Para escrever funções que aceitam quantidade variável de parâmetros, usa-se o mecanismo de stdargs do C. Para isso coloca-se “…” como último parâmetro na declaração da função e depois usa-se as funções de stdarg.h … Continue reading

Posted in C, CPP | 6 Comments

C++: Pré-compilação de headers no gcc

Palavras-chave: C++, C, C#, precompiled header, prefix header, g++, lento Se seu programa em C++ demora séculos para compilar, considere usar um recurso do GCC 4 que acelera compilações de maneira bastante simples. Um dos motivo porque programas C++ demoram … Continue reading

Posted in CPP | 1 Comment

C++: undefined reference to `vtable for Classe'

Palavras-chave: C++, gcc, g++, erro, compilacão, linker, linking Na maioria dos casos, o erro undefined reference to `vtable for Class’ ocorre quando falta a definicão de algum método declarado na classe. Certifique-se que seu Makefile contém o arquivo com a … Continue reading

Posted in CPP | 5 Comments

C++: Depurando exceções

Palavras-chave: exceções, gdb, depuração, debug exceptions, catch Ao depurarmos programas C++ o GDB costuma interromper a execução quando a exceção é pega (catch) ou já quando um signal é lançado e o programa é abortado. O problema é que esse … Continue reading

Posted in CPP | Comments Off on C++: Depurando exceções

C, C++: Transformar macros e identificadores em strings

Palavras-chave: C, C++, CPP, macro, string, identificador Para transformar o nome de um macro ou identificador em string: #define STR(s) #s Para transformar o valor de um macro ou identificador em string: #define STRV(s) STR(s) O seguinte exemplo ilustra a … Continue reading

Posted in C, CPP | 3 Comments