Basicos de C
strcpy(newstr,str) /* copia str para newstr */ expr1 ? expr2 : expr3 /* if (expr1) expr2 else expr3 */ x = (y > z) ? y : z; /* if (y > z) x = y; else x = z; */ int a[]={0,1,2}; /* Array inicializada (ou a[3]={0,1,2}; */ int a[2][3]={{1,2,3},{4,5,6}}; /* Array de array de ints */ int i = 12345; /* Converte de i para char str */ char str[10]; sprintf(str, "%d", i);
Exemplo de C
Um programa c mínimo simple.c:
#include <stdio.h> main() { int number=42; printf("The answer is %i\n", number); }
Compile com o:
# gcc simple.c -o simple # ./simple The answer is 42
Básicas do C++
*pointer // Objeto apontado pelo apontador &obj // Endereço do objeto obj obj.x // Membro x da classe obj (objeto obj) pobj->x // Membro x da classe apontado para pobj // (*pobj).x e pobj->x são os mesmos
Exemplo de C++
Com um programa ligeiramete mais realístico em C++: uma classe em seu próprio header (IPv4.h) e a implementação (IPv4.cpp) e um programa que utiliza a funcionalidade da classe. A classe converte um endereço de IP em formato integer para o formato de cadeia conhecido.
Classe IPv4
IPv4.h:
#ifndef IPV4_H #define IPV4_H #include <string> namespace GenericUtils { // gera um namespace class IPv4 { // definição de classe public: IPv4(); ~IPv4(); std::string IPint_to_IPquad(unsigned long ip);// interface membro }; } //namespace GenericUtils #endif // IPV4_H
IPv4.cpp:
#include "IPv4.h" #include <string> #include <sstream> using namespace std; // utiliza os namespaces using namespace GenericUtils; IPv4::IPv4() {} // construtor/destrutor padrão IPv4::~IPv4() {} string IPv4::IPint_to_IPquad(unsigned long ip) { // implementação membro ostringstream ipstr; // utiliza uma stringstream ipstr << ((ip &0xff000000) >> 24) // Bitwise right shift << "." << ((ip &0x00ff0000) >> 16) << "." << ((ip &0x0000ff00) >> 8) << "." << ((ip &0x000000ff)); return ipstr.str(); }
o programa simplecpp.cpp
#include "IPv4.h" #include <iostream> #include <string> using namespace std; int main (int argc, char* argv[]) { string ipstr; // define variáveis unsigned long ipint = 1347861486; // O IP em forma integer GenericUtils::IPv4 iputils; // gera um objeto da classe ipstr = iputils.IPint_to_IPquad(ipint); // chama a classe membro cout << ipint << " = " << ipstr << endl; // imprime o resultado return 0; }
Compile e execute com:
# g++ -c IPv4.cpp simplecpp.cpp # Compile em objetos # g++ IPv4.o simplecpp.o -o simplecpp.exe # Linka os objetos para o executável final # ./simplecpp.exe 1347861486 = 80.86.187.238
Utilize ldd
para verificar que bibliotecas são utilizadas pelo executável e aonde eles ficam localizados. utilize também para verificar se uma biblioteca compartilhada está faltando ou se o executável é estático.
# ldd /sbin/ifconfig # lista dependências de objeto dinâmico # ar rcs staticlib.a *.o # gera arquivo estático # ar t staticlib.a # imprime a lista de objetos do arquivo # ar x /usr/lib/libc.a version.o # extrai um objeto arquivo # nm version.o # Exibe membros de função fornecidas pelo objeto
Simples Makefile
O Makefile mínimo para o programa multi-source é exibido abaixo. As linhas com instruções devem iniciar com um tab! A barra invertida (back slash) “\” pode ser utilizada para cortar linhas longas.
CC = g++ CFLAGS = -O OBJS = IPv4.o simplecpp.o simplecpp: ${OBJS} ${CC} -o simplecpp ${CFLAGS} ${OBJS} clean: rm -f ${TARGET} ${OBJS}