инициализация структуры завершается с GCC 4 - PullRequest
1 голос
/ 11 октября 2011

У меня очень странная проблема при инициализации структуры с помощью GCC 4.5.3 на моем x86_64 Linux box.

Код, о котором идет речь:

struct apr_finfo_t info = { 0 };

apr_finfo_t - довольно сложная структура.Я просто скажу, что у него 17 сложных других членов.

struct apr_finfo_t {
    /** Allocates memory and closes lingering handles in the specified pool */
    apr_pool_t *pool;
    /** The bitmask describing valid fields of this apr_finfo_t structure 
     *  including all available 'wanted' fields and potentially more */
    apr_int32_t valid;
    /** The access permissions of the file.  Mimics Unix access rights. */
    apr_fileperms_t protection;
    /** The type of file.  One of APR_REG, APR_DIR, APR_CHR, APR_BLK, APR_PIPE, 
     * APR_LNK or APR_SOCK.  If the type is undetermined, the value is APR_NOFILE.
     * If the type cannot be determined, the value is APR_UNKFILE.
     */
    apr_filetype_e filetype;
    /** The user id that owns the file */
    apr_uid_t user;
    /** The group id that owns the file */
    apr_gid_t group;
    /** The inode of the file. */
    apr_ino_t inode;
    /** The id of the device the file is on. */
    apr_dev_t device;
    /** The number of hard links to the file. */
    apr_int32_t nlink;
    /** The size of the file */
    apr_off_t size;
    /** The storage size consumed by the file */
    apr_off_t csize;
    /** The time the file was last accessed */
    apr_time_t atime;
    /** The time the file was last modified */
    apr_time_t mtime;
    /** The time the file was created, or the inode was last changed */
    apr_time_t ctime;
    /** The pathname of the file (possibly unrooted) */
    const char *fname;
    /** The file's name (no path) in filesystem case */
    const char *name;
    /** The file's handle, if accessed (can be submitted to apr_duphandle) */
    struct apr_file_t *filehand;
};

Теперь, когда компилируем эту часть с GCC 4.5.3 и -std = c99 -pedantic -Wextra , я 'я вижу следующее предупреждающее сообщение:

src/switch_apr.c: In function ‘switch_file_exists’:
src/switch_apr.c:518: warning: missing initializer
src/switch_apr.c:518: warning: (near initialization for ‘info.valid’)

Очевидно, что GCC пытается инициализировать первого участника, но уже подавляет второго.Это предупреждение НЕ появляется, когда не строится с -W / -Wextra .

I может инициализировать каждый элемент вручную, но это звучит страннои неправильно.

Судя по тому, что я мог почерпнуть из поиска Google, кажется, что эта инициализация совершенно законна, и есть отчеты для GCC 3, где она работает.Не с GCC 4.5 или 4.1, хотя.

Надеюсь, кто-то может помочь.:)

С уважением,

Михай

Ответы [ 2 ]

3 голосов
/ 11 октября 2011

Параметр командной строки -Wextra включает -Wmissing-field-initializers.
Попробуйте добавить -Wno-missing-field-initializers к командной строке.

$ cat 7724939.c 
#include <stdlib.h>

struct whatever {
  int a;
  int j;
  int k;
};

int main(void) {
  struct whatever x = {0};
  if (x.k) return EXIT_FAILURE;
  return 0;
}
$ gcc --version
gcc (Debian 4.6.1-4) 4.6.1
Copyright (C) 2011 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ gcc -std=c99 -pedantic 7724939.c 
$ gcc -std=c99 -pedantic -Wall -Wextra 7724939.c 
7724939.c: In function ‘main’:
7724939.c:10:10: warning: missing initializer [-Wmissing-field-initializers]
7724939.c:10:10: warning: (near initialization for ‘x.j’) [-Wmissing-field-initializers]
$ gcc -std=c99 -pedantic -Wall -Wextra -Wno-missing-field-initializers 7724939.c 
$ 

Обратите внимание, что C не требует предупрежденияСтандарт.Это просто ваш компилятор пытается (слишком) помочь.

0 голосов
/ 11 октября 2011

Если вы используете C ++, было бы намного лучше включить конструктор, который инициализирует, так что инициализация должна была бы быть записана в конструкторе, а не везде.

...