-
Notifications
You must be signed in to change notification settings - Fork 1
Code style
Gabriel Lampa edited this page Apr 14, 2018
·
20 revisions
- Palavras reservadas (
ifintwhileconsttypedef) são sempre seguidas de um espaço em branco;- Exeto para
returnquando a função é do tipovoid.
- Exeto para
- Tipos de dados inteiros devem ser declarados no padrão do header
stdint.h:
| unsigned | min - max | signed | min - max |
|---|---|---|---|
| uint8_t | 0 a 255 | int8_t | -128 a 127 |
| uint16_t | 0 a 65535 | int16_t | -32768 a 32767 |
| uint32_t | 0 a 4294967295U | int32_t | -2147483648 a 2147483647 |
| uint64_t | 0 a 18446744073709551615 | int64_t | -9223372036854775808 a 9223372036854775807 |
- Use
char *varao invés dechar* var;
- Como declarar variáveis:
- Variáveis locais com nome em letras minúsculas;
- Uma variável por linha;
- Isso também se aplica para campos de
structeenum
- Isso também se aplica para campos de
- Declarar a variável o mais próximo possível do seu uso.
- Cada declaração deve ter apenas uma variável declarada nela.
DESEJADO:
int x;
int t;INDESEJADO:
int x, y;- Como declarar variáveis globais:
- Declare-a fora do escopo de qualquer função;
- Funções com variáveis locais com mesmo nome de variáveis globais, dará preferência a variáveis locais;
- Ao declarar uma função global, documente-a de forma adequada;
- Use o sufixo _g.
- Evite ao máximo adicionar variáveis globais ao projeto.
DESEJADO:
int global_g;INDESEJADO:
int global;#define é uma diretiva de pré-processador que gera uma constante
- Como declarar
#define:- Use sempre letras maiúsculas;
- Sua sintaxe é:
#define <CONSTANTE_NOME> <valor>; - A declaração deve ser feita no início do programa;
-
#definenão precisa de ponto e vírgula.
-
#definepara funçõesinlinesão bem vindas.
DESEJADO:
#define PI 3.14INDESEJADO:
#define pi 3.14
#define PI 3.14;- Códigos de erro tem o prefixo
E_:
Exemplo códigos de erro:
#define E_ISNULL -1
#define E_MALLOC -101
#define E_REALLOC -102
#define E_CALLOC -103
#define E_FREE -104- Como declarar sentinelas no headers:
- Nome em letras maiúsculas;
- prefixo
INCLUIDO_+ NOME DO HEADER + sufixo_H.
Exemplo de sentinela:
#ifndef INCLUIDO_ERROS_H
#define INCLUIDO_ERROS_H
- Como declarar uma
struct:- Nome com letras minúsculas;
- Campos com nomes de
<tag>devem ficar idênticos ao do Manual do Contribuinte (Quando aplicável);
- Campos com nomes de
- Nome com sufixo
_s; - Declaração sem
typedef; - Campos com nomes idênticos ao do Manual do Contribuinte (Quando aplicável);
- A grande maioria são do
tipo opaco; - Um campo para cada linha;
- Quando se faz necessário o uso do
typedef, perde-se o sufixo_se a primeira letra do nome é maiúscula.
- Nome com letras minúsculas;
DESEJADO:
struct endereco_s{
const char *xLgr;
const char *nro;
const char *Cpl;
const char *xBairro;
uint32_t CEP;
uint64_t fone;
Municipio *municipio;
};INDESEJADO:
struct Endereco_s{
const char *xLgr;
const char *nro;
const char *Cpl;
const char *xBairro;
uint32_t CEP;
uint64_t fone;
Municipio *municipio;
};struct endereco{
const char *xLgr;
const char *nro;
const char *Cpl;
const char *xBairro;
uint32_t CEP;
uint64_t fone;
Municipio *municipio;
};DESEJADO:
Endereco* NewEndereco();
static void _delPais(Pais *t);- Como declarar um
union:- Nome com letras minúsculas;
- Campos com nomes de
<tag>devem ficar idênticos ao do Manual do Contribuinte (Quando aplicável);
- Campos com nomes de
- Nome com sufixo
_u; - Declaração sem
typedef; - A grande maioria são do
tipo opaco; - Um campo para cada linha;
- Quando se faz necessário o uso do
typedef, perdesse o sufixo_ue a primeira letra do nome é maiúscula.
- Nome com letras minúsculas;
- Campos com nomes de idênticos ao do Manual do Contribuinte (Quando aplicável);
DESEJADO:
union NFref_u{
struct refNFe_s refNFe;
struct refNF_s refNF;
struct refNFP_s refNFP;
struct refCTe_s refCTe;
struct refECF_s refECF;
};Usamos enum para identificar os tipos.
Exemplo
union NFref_u{
struct refNFe_s refNFe;
struct refNF_s refNF;
struct refNFP_s refNFP;
struct refCTe_s refCTe;
struct refECF_s refECF;
};
enum TIPO_NOTA_E {
NOTA_NFE = 0,
NOTA_NF = 2,
NOTA_NFP = 3,
NOTA_CTE = 4,
NOTA_ECF = 9
};
struct nota_s{
union NFref_u nota;
enum TIPO_NOTA_E tipo;
}; - Use letras maiúsculas;
- Use o sufixo
_E; - Não use
typedefsalva rara exceções; - Declare somente um valor por linha;
- É permitido comentários
/*comentário*/entre os campos; - Declare-os preferencialmente nos headers;
- Atribua valor sempre que possível.
EXEMPLO:
enum COD_UF_E {
/* Regiao Norte*/
UF_RONDONIA = 11,
UF_ACRE = 12,
UF_AMAZONAS = 13,
UF_RORAIMA = 14,
UF_PARA = 15,
UF_AMAPA = 16,
UF_TOCANTIS = 17,
/*Regiao Nordeste*/
UF_MARANHAO = 21,
UF_PIAUI = 22,
UF_CEARA = 23,
UF_RIO_GRANDE_N = 24,
UF_PARAIBA = 25,
UF_PERNAMBUCO = 26,
UF_ALAGOAS = 27,
UF_SERGIPE = 28,
UF_BAHIA = 29,
/*Regiao Sudeste*/
UF_MINAS_GERAIS = 31,
UF_ESPIRITO_SANTO = 32,
UF_RIO_JANEIRO = 33,
UF_SAO_PAULO = 35,
/*Regiao Sul*/
UF_PARANA = 41,
UF_SANTA_CATARINA = 42,
UF_RIO_GRANDE_S = 43,
/*Regiao Centro Oeste*/
UF_MATO_GROSSO_S = 50,
UF_MATO_GROSSO = 51,
UF_GOIAS = 52,
UF_DISTRITO_FEDERAL = 53
};
enum FORMA_PAGAMENTO_E {
PAGAMENTO_AVISTA = 0,
PAGAMENTO_PRAZO = 1,
PAGAMENTO_OUTROS = 2
};
enum DOCUMENTO_MODELO_E {
MODELO_NFE = 55,
MODELO_NFCE = 65
};- Use preferencialmente nomes compostos;
- Deem nomes que fazem sentido.
EXEMPLO:
enum TIPO_OPERACAO_E {
OPERACAO_ENTRADA = 0,
OPERACAO_SAIDA = 1
};- As funções que alocam e desalocam memória, precisa tratar desses ponteiros para evitar erros.
- Verifique se
malloc()retornouNULL; - Verifique se o ponteiro é
NULLantes de chamarfree(); -
strdup()pode falhar ao tentar alocar memória; -
mencpy()falha se passado um ponteiro nulo;
- Verifique se
- Funções devem ter seu tipo e modificadores declarados na mesma linha que seu nome;
- Funções são sempre
UpperCamelCase; - Funções com o modificador de escopo
staticsão prefixada com_lowCamelCase.
- Funções
UpperCamelCase; - Funções com o prefixos
GetouSetseguido do nome do campo; - Em sua maioria, funções
GetseSetstem visibilidade para todo o projeto.
EXEMPLO:
static void _delYoda();
unsigned int SetCEP(Endereco *end, unsigned int c);
unsigned int GetCEP(Endereco *end);- Funções
UpperCamelCase; - Funções com o prefixos New ou
Delseguido do nome do Objeto;- Prefixo
_delou_newsomado ao nome do objeto para funções comstatic;
- Prefixo
- Visibilidade dessas funções nem sempre disponível para todo o usuário.
EXEMPLO:
Endereco * NewEndereco(void);
void DelEndereco(Endereco *t);
unsigned int SetCEP(Endereco *end, unsigned int c);
unsigned int GetCEP(Endereco *end);- Não chame funções dentro de
if; - Condições de Yoda não devem ser usadas:
- Sempre usar
{ }mesmo para uma só instrução.
DESEJADO:
int rc;
rc = foo();
if (rc){
/*Código aqui*/
}DESEJADO:
if (foo()){
/*Código aqui*/
}- Indentar
elsealinhado comif; - Sempre usar
{ }noelsemesmo para uma só instrução.
DESEJADO:
if (foo()){
/*Código aqui*/
}else {
/*Mais código aqui*/
}- Sempre que possível, colocar
default; - Não se esqueça de
break; - A instrução
switchdeve ser escrita como no exemplo:
DESEJADO:
switch (var){
case 1:
foo();
i++;
break;
case 2:
bar();
--i;
break;
default:
x++;
};- Use com parcimônia;
- Sempre em uma única linha.
DESEJADO:
#define free_memory(p) (p == NULL ? p : free(p))- Expressões, entre parênteses, devem ser separadas por espaço após o ponto-e-vírgula;
- Para compatibilidade e portabilidade declare o contador fora da instrução;
- Sempre usar
{ }mesmo para uma só instrução.
DESEJADO:
for (i=0; i<10; i++){
foo();
}- A instrução
whiledeve ser escrita como no exemplo:
DESEJADO:
while ( x < 10 ) {
printf( "%d\n", x );
x++;
}do {
} while ( condição );