Inicializar matriz com elemento extra usando uma macro

8

Estou inicializando uma matriz de duas maneiras diferentes, dependendo de uma macro:

# if feature_enabled
const int v[4] = {1, 2, 3, 4};
#else
const int v[5] = {0, 1, 2, 3, 4};
#endif

O problema é que os dados na atribuição são na verdade matrizes grandes e, por várias razões, não é uma boa solução apenas copiar os dados com uma pequena modificação (apenas mais um elemento no início da matriz).

Fiquei me perguntando se existe uma maneira de fazer a mesma coisa que fiz aqui, sem duplicar essencialmente os últimos elementos n-1.

CE
fonte
6
Você sabia que o tamanho da matriz não corresponde ao número de elementos na lista de inicializadores?
Mc #
@ mch corrigiu agora, era apenas algo que eu digitei para a pergunta.
CE
@CE "e por várias razões, não é uma boa solução apenas copiar os dados com uma pequena modificação" - Você poderia nos dar uma referência para isso? Qual é a sua preocupação?
RobertS suporta Monica Cellio 6/12/19
@ RobertS-ReinstateMonica Por que, em geral, a duplicação de código é ruim? Esse é um tópico bastante amplo. Felizmente, recebi minha resposta de qualquer maneira.
CE
@CE Você não precisa fazer uma explicação detalhada, seria bom se você pudesse dar uma referência pelo menos ao que você está apontando e qual é a base dessa pergunta. Portanto, pessoas que não são confirmadas com essas coisas podem entender o objetivo dessa pergunta.
RobertS suporta Monica Cellio 6/12/19

Respostas:

16

Se você não especificar o tamanho na matriz, mas permitir deduzir automaticamente, basta adicionar o 0 na frente condicionalmente:

const int v[] = {
# if feature_enabled
  0,
#endif
  1, 2, 3, 4
};
Turtlefight
fonte
3

Se você precisar manter o tamanho da matriz, então:

# if feature_enabled
const int v[4] = {
#else
const int v[5] = {0,
#endif
  1, 2, 3, 4
};
mik
fonte