Eu quero inicializar um elemento struct, dividido em declaração e inicialização. Isto é o que eu tenho:
typedef struct MY_TYPE {
bool flag;
short int value;
double stuff;
} MY_TYPE;
void function(void) {
MY_TYPE a;
...
a = { true, 15, 0.123 }
}
É assim que se declara e inicializa uma variável local de MY_TYPE
acordo com os padrões da linguagem de programação C (C89, C90, C99, C11, etc.)? Ou há algo melhor ou pelo menos funcionando?
Atualização Acabei tendo um elemento de inicialização estático, onde defini todos os subelementos de acordo com minhas necessidades.
c
struct
initialization
Vergonhoso
fonte
fonte
Respostas:
No (ANSI) C99, você pode usar um inicializador designado para inicializar uma estrutura:
Editar: Outros membros são inicializados como zero: "Membros de campo omitidos são inicializados implicitamente da mesma forma que objetos que têm duração de armazenamento estático". ( https://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html )
fonte
Você pode fazer isso com um literal composto . De acordo com essa página, ele funciona em C99 (que também conta como ANSI C ).
As designações nos inicializadores são opcionais; você também pode escrever:
fonte
Vejo que você já recebeu uma resposta sobre o ANSI C 99, portanto, discutirei o ANSI C 89. O ANSI C 89 permite que você inicialize uma estrutura dessa maneira:
É importante lembrar que, no momento em que você inicializa até um objeto / variável na estrutura, todas as outras variáveis serão inicializadas com o valor padrão.
Se você não inicializar os valores em sua estrutura, todas as variáveis conterão "valores de lixo".
Boa sorte!
fonte
a = (MYTYPE){ true, 15, 0.123 };
faria bem em C99
fonte
Você quase conseguiu ...
A pesquisa rápida em 'struct initialize c' mostra-me isto
fonte
A norma de linguagem de programação C ISO / IEC 9899: 1999 (comumente conhecida como C99) permite usar um inicializador designado para inicializar membros de uma estrutura ou união da seguinte maneira:
É definido na
paragraph 7
seção6.7.8 Initialization
da norma ISO / IEC 9899: 1999 como:Observe que
paragraph 9
na mesma seção afirma que:Na implementação do GNU GCC, no entanto, os membros omitidos são inicializados como zero ou valor apropriado para o tipo zero. Conforme indicado na seção 6.27 Inicializadores designados da documentação do GNU GCC:
O compilador do Microsoft Visual C ++ deve oferecer suporte a inicializadores designados desde a versão 2013, de acordo com o post oficial do blog C ++ Conformance Roadmap . O artigo Parágrafo
Initializing unions and structs
do inicializador na documentação do MSDN Visual Studio sugere que membros sem nome inicializassem com valores apropriados de zero-zero, de maneira semelhante ao GNU GCC.A norma ISO / IEC 9899: 2011 (comumente conhecida como C11) que substituiu a ISO / IEC 9899: 1999 mantém os inicializadores designados na seção
6.7.9 Initialization
. Ele também mantémparagraph 9
inalterado.O novo padrão ISO / IEC 9899: 2018 (conhecido como C18) que substituiu o ISO / IEC 9899: 2011 mantém os inicializadores designados na seção
6.7.9 Initialization
. Ele também mantémparagraph 9
inalterado.fonte
struct thing { union { char ch; int i; }; };
. O padrão diz mais tarde: "Se houver menos inicializadores em uma lista entre chaves, do que elementos ou membros de um agregado, ou menos caracteres em uma cadeia de caracteres literal usada para inicializar uma matriz de tamanho conhecido do que os elementos da matriz, o restante do agregado deve ser inicializado implicitamente da mesma forma que os objetos com duração de armazenamento estático. "como Ron Nuni disse:
Uma coisa importante a lembrar: no momento em que você inicializa até um objeto / variável na estrutura, todas as outras variáveis serão inicializadas com o valor padrão.
Se você não inicializar os valores em sua estrutura (por exemplo, se você apenas declarar essa variável), todos
variable.members
conterão "valores de lixo", apenas se a declaração for local!Se a declaração for global ou estática (como neste caso), todos os não inicializados
variable.members
serão inicializados automaticamente para:0
para números inteiros e ponto flutuante'\0'
parachar
(é claro que isso é exatamente o mesmo que0
echar
é um tipo inteiro)NULL
para ponteiros.fonte
fonte
Se a MS não tiver atualizado para C99, MY_TYPE a = {true, 15,0.123};
fonte
Encontrei outra maneira de inicializar estruturas.
A estrutura:
Inicialização:
De acordo com a documentação do GCC, essa sintaxe é obsoleta desde o GCC 2.5 .
fonte
Eu não gostei de nenhuma dessas respostas, então criei as minhas. Não sei se isso é ANSI C ou não, é apenas o GCC 4.2.1 no modo padrão. Como nunca me lembro do bracketing, começo com um subconjunto dos meus dados e luto com as mensagens de erro do compilador até que ele seja encerrado. A legibilidade é minha primeira prioridade.
Os dados podem iniciar a vida como um arquivo delimitado por tabulação que você substitui para massagear outra coisa. Sim, isso é material do Debian. Portanto, um par externo de {} (indicando a matriz) e outro par para cada estrutura interna. Com vírgulas entre. Colocar as coisas em um cabeçalho não é estritamente necessário, mas eu tenho cerca de 50 itens na minha estrutura, então eu os quero em um arquivo separado, para manter a bagunça fora do meu código e para facilitar a substituição.
fonte
A estrutura em C pode ser declarada e inicializada assim:
fonte
Eu li a documentação do Microsoft Visual Studio 2015 para inicializar tipos agregados ainda, todas as formas de inicialização com
{...}
são explicadas lá, mas a inicialização com ponto, denominada '' designador '' não é mencionada lá. Também não funciona.O capítulo C.7 da norma C99 6.7.8 Inicialização explica a possibilidade de designadores, mas, na minha opinião, não é realmente claro para estruturas complexas. O padrão C99 como pdf .
Na minha opinião, pode ser melhor
= {0};
inicialização para todos os dados estáticos. É menos esforço para o código da máquina.Use macros para inicializar, por exemplo
typedef MyStruct_t{ int x, int a, int b; } MyStruct; define INIT_MyStruct(A,B) { 0, A, B}
A macro pode ser adaptada, sua lista de argumentos pode ser independente do conteúdo da estrutura alterado. É adequado se menos elementos forem inicializados. Também é adequado para estrutura aninhada. 3. Um formulário simples é: Inicialize em uma sub-rotina:
Essa rotina se parece com ObjectOriented em C. Use
thiz
, nãothis
para compilá-la com C ++ também!fonte
Eu tenho procurado uma boa maneira de inicializar minha estrutura, e eu tenho que usar o abaixo (C99). Isso me permite inicializar uma única estrutura ou uma matriz de estruturas da mesma maneira que os tipos simples.
Isso pode ser usado no código como:
fonte
jsmn_ts_default
, mas o restante das estruturas é inicializado como se a matriz tivesse duração de armazenamento estático, o que significa que os membros foram inicializados emNULL
e0
. Mas se você alterar#define jsmn_ts_default (jsmn_ts){"default", sizeof "default", NULL, 0}
, verá que apenas o primeiro elemento da matriz é inicializado.int a[10] = {1};
apenas o elemento 1 será==1