Criando matriz com constante
-
21-09-2019 - |
Pergunta
Eu estava trabalhando em um programa no NetBeans no Linux usando um compilador GCC quando, ao alternar para o visual c ++ no Windows 7, o código falhou em compilar como o visual c ++ diz isso expected constant expression
em várias linhas. Em netbeans, eu simplesmente fiz algo semelhante a char name[fullName.size()];
, enquanto no Visual C ++, eu tentei, entre outras coisas,
const int position = fullName.size();
char Name[position];
Como posso criar uma constante para usar para a matriz?
Nota: Eu sei sobre essa questão, mas existe alguma maneira de fazer isso funcionar sem usar vetores, pois isso exigiria uma reescrita de muitas partes do programa?
Solução
No VC ++, você não pode fazer declarações de tempo de execução de tamanhos de matriz de pilha, mas você pode fazer alocação de empilhamento via _Aloca
então, é isso:
const int position = fullName.size();
char Name[position];
torna -se o seguinte:
const int position = fullName.size();
char * Name = (char*)_alloca(position * sizeof(char));
Não é exatamente a mesma coisa, mas é o mais próximo que você entrará no VC ++.
Outras dicas
Isso não é possível no VC ++. Eu sei, muito triste :(
As soluções incluem:
- Crie -o na pilha
- Torne -o constante
O novo padrão C ++ (C ++ 0x) propõe um recurso 'Expressão constante' para lidar com isso. Para mais informações, verifique isto Fora.
C ++ exige que o tamanho da matriz seja conhecido no momento da compilação. Se você não se importa de usar uma extensão fora do padrão, o GCC permite código como você está fazendo (observe que, embora não seja padrão C ++, ele é padrão em c, a partir de C99).
Eu também acho que você poderia usar um vetor (nesse lugar em particular) com menos problemas do que você acredita-um pouco de código escrito para uma matriz pode funcionar com um vetor com apenas um recompile e pouco ou nenhuma reescrita.
Sua char name[fullName.size()];
é um exemplo de um matriz de comprimento variável que - até onde eu sei - não são padronizados em C ++, então você está à mercê do compilador. [Ligeiramente fora do tópico, eles fazem parte do padrão C99