Const correção em C

9

Aparentemente, é uma boa prática usar const , a menos que algo seja mutável, mas até onde você vai? Se eu tiver uma matriz de strings, a assinatura da minha função deve incluir isso?

char const * const * const my_strings

Eu não vou modificá-lo qualquer , por isso é um ponteiro constante para o primeiro elemento de uma matriz de ponteiros constantes para os primeiros elementos de matrizes de caracteres constantes. Isso é um bocado, e o código é quase ilegível. Tudo isso é uma estrutura de dados simples, como argv .

Eu sinto que const deve ser padrão e deve haver uma palavra-chave mutável.

Você geralmente é apenas um desses const s? Qual é o sentido disso, se você ainda puder alterá-lo facilmente desreferindo mais ou menos?

    
por mk12 09.08.2012 в 02:03
fonte

1 resposta

5

Eu geralmente usaria dois dos três const s:

const char *const *my_strings;

Às vezes eu usaria todos os três, mas na minha opinião o último é o menos importante. Ele só ajuda a analisar o código que usa a variável my_strings , enquanto os outros dois ajudam a analisar o código que possui qualquer ponteiro para a matriz apontada por my_strings ou às cadeias apontadas pelos elementos dessa matriz. Geralmente, é mais código, em vários lugares diferentes (por exemplo, o chamador de uma função e a própria função) e, portanto, uma tarefa mais difícil.

O código que usa a própria variável é limitado ao escopo de my_strings , portanto, se essa é uma variável automática (incluindo um parâmetro de função), ela é bem contida e uma tarefa mais fácil. A ajuda fornecida pela marcação de const ainda pode ser apreciada, mas é menos importante.

Eu também diria que se char const * const * const my_strings for "quase ilegível", isso mudará quando você tiver mais prática na leitura de C, e é melhor obter essa prática do que alterar o código. Há algum valor na escrita do código C que pode ser lido facilmente pelos iniciantes, mas não tanto quanto é necessário para fazer algum trabalho; -)

Você poderia usar typedefs para tornar a definição da variável mais curta, ao custo de introduzir uma indireção que irritará muitos programadores C:

typedef char const *ro_strptr;
ro_strptr const *my_strings;

Por qualquer motivo, os programadores C muitas vezes querem ver o máximo possível de um tipo em um só lugar. Somente quando o tipo é genuinamente complicado (tipos de ponteiro para função) você pode usar um typedef apenas para abreviar, sem esperar que alguém se queixe disso.

    
por Steve Jessop 09.08.2012 / 02:22
fonte