Eu recebo um erro na linha 6 (inicialize my_foo para foo_init) do programa a seguir e não sei se entendi o porquê.
typedef struct foo_t {
int a, b, c;
} foo_t;
const foo_t foo_init = { 1, 2, 3 };
foo_t my_foo = foo_init;
int main()
{
return 0;
}
Lembre-se de que esta é uma versão simplificada de um projeto maior com vários arquivos em que estou trabalhando. O objetivo era ter uma única constante no arquivo de objeto, que vários arquivos pudessem usar para inicializar uma estrutura de estado. Como é um destino incorporado com recursos limitados e a estrutura não é tão pequena, não quero várias cópias da fonte. Prefiro não usar:
#define foo_init { 1, 2, 3 }
Também estou tentando escrever código portátil, por isso preciso de uma solução que seja válida C89 ou C99.
Isso tem a ver com os ORGs em um arquivo de objeto? Que variáveis inicializadas entram em um ORG e são inicializadas copiando o conteúdo de um segundo ORG?
Talvez eu precise mudar minha tática e ter uma função de inicialização para fazer todas as cópias na inicialização. A menos que haja outras idéias por aí?
fonte
enum { N = 5 };
é uma maneira subestimada de declarar constantes sem ter que recorrer#define
.static int* ptr = malloc(sizeof(int)*5);
mas NÃO é um errostatic int* ptr; ptr = malloc(sizeof(int)*5);
:: DÉ uma limitação do idioma. Na seção 6.7.8 / 4:
Na seção 6.6, a especificação define o que deve ser considerado uma expressão constante. Em nenhum lugar onde afirma que uma variável const deve ser considerada uma expressão constante. É legal para um compilador estender isso (
6.6/10 - An implementation may accept other forms of constant expressions
), mas isso limitaria a portabilidade.Se você pode alterar
my_foo
para que ele não tenha armazenamento estático, você pode ficar bem:fonte
static const int x = 3; static int y = x;
.Apenas para ilustração, compare e compare O código é de http://www.geeksforgeeks.org/g-fact-80/ / O código falha no gcc e passa no g ++ /
fonte
Isso é um pouco antigo, mas tive um problema semelhante. Você pode fazer isso se usar um ponteiro:
fonte
O gcc 7.4.0 não pode compilar códigos como abaixo:
constchar.c: 3: 21: erro: o elemento inicializador não é constante const char * str2 = str1;
De fato, uma string "const char *" não é uma constante em tempo de compilação, portanto, não pode ser um inicializador. Mas uma string "const char * const" é uma constante em tempo de compilação; deve poder ser um inicializador. Eu acho que isso é uma pequena desvantagem do CLang.
É claro que um nome de função é uma constante em tempo de compilação.
fonte
str1
não é uma expressão de acordo com 6.7.9 Inicialização , parágrafo 4 : "Todas as expressões em um inicializador para um objeto com duração de armazenamento estático ou de encadeamento devem ser expressões constantes ou literais de string".