Quais são as convenções de nomenclatura comumente usadas em C? Eu sei que existem pelo menos dois:
- GNU / linux / K&R com lower_case_functions
- ? nome? com funções UpperCaseFoo
Eu estou falando sobre C apenas aqui. A maioria de nossos projetos são pequenos sistemas embarcados nos quais usamos C.
Aqui está o que estou planejando usar para o meu próximo projeto:
Convenção de nomenclatura C
Struct TitleCase
Struct Members lower_case or lowerCase
Enum ETitleCase
Enum Members ALL_CAPS or lowerCase
Public functions pfx_TitleCase (pfx = two or three letter module prefix)
Private functions TitleCase
Trivial variables i,x,n,f etc...
Local variables lower_case or lowerCase
Global variables g_lowerCase or g_lower_case (searchable by g_ prefix)
c
naming-conventions
JeffV
fonte
fonte
Respostas:
A coisa mais importante aqui é consistência. Dito isto, sigo a convenção de codificação GTK +, que pode ser resumida da seguinte forma:
MAX_BUFFER_SIZE
,TRACKING_ID_PREFIX
.GtkWidget
,TrackingOrder
.gtk_widget_show()
,tracking_order_process()
.GtkWidget *foo
,TrackingOrder *bar
._refrobnicate_data_tables()
,_destroy_cache()
.fonte
static
e pular o prefixo do módulo; portanto, segtk_widget_show()
fosse uma função com escopo de arquivo, ela se tornaria simplesmentewidget_show()
com a classe de armazenamento estático adicionada._
a implementação e uso futuro. Existem algumas exceções nos nomes que começam com,_
mas na minha opinião não vale a pena memorizar. Uma regra segura a seguir é nunca usar nomes que começam com_
seu código. Entrada relevante da FAQ C: c-faq.com/~scs/cgi-bin/faqcat.cgi?sec=decl#namespaceGlobal variables: just don't use global variables. They are evil.
- a menos que você esteja trabalhando no projeto incorporado e tenha 1024 bytes de RAM e CPU de 8MHz."Ponteiros estruturais" não são entidades que precisam de uma cláusula de convenção de nomenclatura para cobri-los. Eles são apenas
struct WhatEver *
. NÃO esconda o fato de que há um ponteiro envolvido com um typedef inteligente e "óbvio". Não serve para nada, é mais demorado para digitar e destrói o equilíbrio entre declaração e acesso.fonte
Bem, em primeiro lugar, C não possui funções públicas / privadas / virtuais. Isso é C ++ e tem convenções diferentes. Em C, normalmente você tem:
C ++ é mais complexo. Eu vi uma mistura real aqui. Camel case para nomes de classe ou minúsculas + sublinhados (case camel é mais comum na minha experiência). As estruturas são usadas raramente (e geralmente porque uma biblioteca as exige, caso contrário, você usaria classes).
fonte
external linkage
"funções públicas" einternal linkage
"funções privadas".ALL_CAPS
também é frequentemente usado para valores de enumeração.Você sabe, eu gosto de mantê-lo simples, mas claro ... Então, aqui está o que eu uso, em C:
i,n,c
(. Apenas uma carta Se uma letra que não está claro, em seguida, torná-lo uma variável local), etc ...lowerCamelCase
g_lowerCamelCase
ALL_CAPS
p_
a ao prefixo. Para variáveis globais, seriagp_var
, para variáveis locaisp_var
, para variáveis constp_VAR
. Se ponteiros distantes forem usados, use umfp_
vez dep_
.ModuleCamelCase
(Módulo = nome completo do módulo ou abreviação de 2-3 letras, mas ainda emCamelCase
.)lowerCamelCase
ModuleCamelCase
ALL_CAPS
ModuleCamelCase
CamelCase
CamelCase
Digitei minhas estruturas, mas usei o mesmo nome para a tag e para o typedef. A tag não deve ser usada com frequência. Em vez disso, é preferível usar o typedef. Também encaminhar declarar o typedef no cabeçalho do módulo público para encapsulamento e para que eu possa usar o nome typedef na definição.
struct
Exemplo completo :fonte
Codificação em C #, java, C, C ++ e C objetivo ao mesmo tempo, adotei uma convenção de nomenclatura muito simples e clara para simplificar minha vida.
Em primeiro lugar, ele conta com o poder dos IDEs modernos (como eclipse, Xcode ...), com a possibilidade de obter informações rápidas ao passar o mouse ou clicar com a tecla Ctrl ... Aceitando isso, suprimi o uso de qualquer prefixo, sufixo e outros marcadores que são simplesmente fornecidos pelo IDE.
Então, a convenção:
parâmetros, elementos struct e union
E é isso.
Dá
fonte
Eu recomendaria não misturar camel case e sublinhar a separação (como você propôs para os membros struct). Isso é confuso. Você pensaria, ei, eu tenho,
get_length
então eu provavelmente deveria termake_subset
e então você descobrirá que é realmentemakeSubset
. Use o princípio de menor espanto e seja consistente.Acho CamelCase útil para digitar nomes, como estruturas, typedefs e enumerações. Isso é tudo, no entanto. Para todo o resto (nomes de funções, nomes de membros de estrutura, etc.) eu uso underscore_separation.
fonte
Aqui está um (aparentemente) incomum, que eu achei útil: nome do módulo no CamelCase, depois um sublinhado, depois o nome da função ou do escopo do arquivo no CamelCase. Então, por exemplo:
fonte
Estou confuso com uma coisa: você está planejando criar uma nova convenção de nomenclatura para um novo projeto. Geralmente, você deve ter uma convenção de nomes que abranja toda a empresa ou equipe. Se você já possui projetos com qualquer forma de convenção de nomenclatura, não deve alterar a convenção para um novo projeto. Se a convenção acima é apenas uma codificação de suas práticas existentes, você é de ouro. Quanto mais difere da existente fato de fato padrões mais difícil será obter participação no novo padrão.
Sobre a única sugestão que gostaria de acrescentar é que gosto de _t no final dos tipos no estilo de uint32_t e size_t. É muito c-ish para mim, embora alguns possam reclamar, é apenas um húngaro "reverso".
fonte
Você também deve pensar na ordem das palavras para completar automaticamente o nome .
Uma boa prática: nome da biblioteca + nome do módulo + ação + assunto
Se uma peça não for relevante, basta ignorá-la, mas pelo menos um nome de módulo e uma ação sempre devem ser apresentados.
Exemplos:
os_task_set_prio
,list_get_size
,avg_get
OS_TASK_PRIO_MAX
fonte
Pode haver muitos, principalmente IDEs, ditando algumas tendências e as convenções de C ++ também estão avançando. Para C geralmente:
A notação húngara para globais é boa, mas não para tipos. E mesmo para nomes triviais, use pelo menos dois caracteres.
fonte
Eu acho que isso pode ajudar para iniciantes: Convenção de nomenclatura de variáveis em c
fonte