Category Archives: C

C: Escondendo o conteúdo de structs com tipos incompletos

Algumas vezes é possível utilizar alguns paradigmas de orientação à objetos em C. Ao se projetar uma biblioteca, podemos encapsular o conteúdo das structs usando tipos incompletos e provendo funções para manipular o conteúdo destas. Imagine uma biblioteca que cria … Continue reading

Posted in C | Tagged , , , , , , | 9 Comments

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: Múltiplos programas no mesmo binário

Um mesmo aplicativo pode se comportar de forma diferente dependendo da forma como é invocado. No exemplo a seguir, o mesmo programa é usado para calcular a raiz quadrada e potência de dois de um dado argumento. #include <libgen.h> #include … Continue reading

Posted in C | Tagged , , | 5 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: Descobrir se um processo está em execução

No Linux é muito comum um daemon, durante sua execução, criar um arquivo .pid dentro de /var/run. Dentro do arquivo syslogd.pid, por exemplo, contém o PID da instância do syslogd em execução. Usa-se este mecanismo para impedir que duas instâncias … Continue reading

Posted in C, Linux, Shell | Tagged , , , , , | 3 Comments

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: Indo para background com o daemon()

A forma tradicional de um programa ir para background é fazendo um fork(), terminar o processo pai e criar uma nova sessão com setsid(). Outra forma mais simples, que de fato encapsula tudo isso e mais um pouco, é apenas … Continue reading

Posted in C | Tagged , , , , , , | 2 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, 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: Ler linhas de um arquivo texto de maneira portável

Palavras-chave: C, arquivo texto, linhas, leitura, getline Como dito num post anterior, a glibc possui uma função para ler linhas de comprimento arbitrário de um arquivo texto. Mas como esta função é especifica a glibc, alguns leitores pediram uma versão … Continue reading

Posted in C | 12 Comments

C: Checar se arquivos de entrada e saída são diferentes

Palavras-chave: C, stdin, stdout, descritor, descriptor, inode, comparar, compare Ao escrever filtros (programas que processam dados provenientes da entrada padrão e os escrevem na saída padrão) pode-se querer evitar que o arquivo de entrada seja o mesmo arquivo utilizado para … Continue reading

Posted in C | Comments Off on C: Checar se arquivos de entrada e saída são diferentes

C: Linkagem estática não encontra funções

Palavras-chave: C, linkagem estática, undefined reference, referência indefinida Ao linkar programas que usam bibliotecas estáticas que por usa vez usam outras bibliotecas estáticas, pode ocorrer de o linker reclamar da falta de símbolos de uma das bibliotecas, apesar de eles … Continue reading

Posted in C | 4 Comments

C: Macros como funções com o while (0)

Palavras-chave: C, macro, multi-statement, cpp, pré-processador, preprocessor Com alguma freqüência é necessário de definir macros com múltiplos comandos (statements) que possam ser usados de forma sintaticamente equivalente a chamadas de função. Nesse caso, não basta definir uma seqüência como: #define … Continue reading

Posted in C | 4 Comments

C: varargs com macros no gcc

Palavras-chave: C, gcc, cpp, macros, …, varargs, número de parâmetros variável, variadic macros Para escrever macros de função com número variável de argumentos: #define DPRINT(fmt, …) printf(“DEBUG: “fmt”\\n”, ## __VA_ARGS__) __VA_ARGS__ será substituído pelos parâmetros dados. E o ## entre … Continue reading

Posted in C | 11 Comments

C: Alocação automática de memória com GNU asprintf()

Palavras-chave: C, sprintf, snprintf, asprintf, formatando strings com tamanho variável Inspirado pelo post do Kojima eu resolvi postar uma dica para um problema similar: normalmente precisamos formatar algum texto usando a função sprintf(), porém ela requer um buffer pré-alocado. Bem, … Continue reading

Posted in C | 12 Comments

C: Redirecionando stdout

É comum em utilitários que rodam em um terminal e escrevem na saída padrão (stdout) a existência de um parâmetro que permite redirecionar a saída para um arquivo (geralmente -o). Uma maneira simples de implementar essa redireção é copiando o … Continue reading

Posted in C | Tagged , , , , , | Comments Off on C: Redirecionando stdout

C: Performance: percorrendo vetores de bytes

Palavras-chave: C, memória, otimização, arrays, vetores, bitmap, pixmap Ao se escrever código para manipulação de strings ou imagens, é comum percorrer grandes vetores de bytes. A maneira óbvia de fazer isto é algo no estilo de: char *ptr= buffer; for … Continue reading

Posted in C | 8 Comments

C: Segmentation fault em programas OpenGL com multi-threading

Palavras-chave: OpenGL, Linux, multi-thread, drivers NVidia, crash, segmentation fault, segfault Se seu programa explode em uma função OpenGL sem nenhum motivo aparente, verifique se a chamada está sendo feita desde a thread onde a OpenGL foi inicializada. As bibliotecas que … Continue reading

Posted in C, Linux | 2 Comments

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

C: Performance: uso eficiente da memória cache

Palavras-chave: C, memória, cache, performance, velocidade Todo processador hoje em dia possui memória cache, que ajuda a melhorar a performance, armazenando os dados mais recentemente acessados, para acesso mais rápido pelo processador. O que nós freqüentemente ignoramos é que a … Continue reading

Posted in C | 8 Comments

C: Ler linhas de um arquivo texto

Palavras-chave: C, arquivo texto, fgets, linhas de comprimento arbitrário O método típico para se ler um arquivo texto linha a linha é usando a função fgets() com um buffer estático. O problema é que nem sempre sabemos qual será o … Continue reading

Posted in C | 9 Comments