Как проверить наличие неиспользуемых членов в структуре? - PullRequest
5 голосов
/ 02 ноября 2010

Если я объявлю и никогда не буду использовать переменную, gcc выдаст мне предупреждение.

Но если у меня есть структура с несколькими членами, и некоторые из них не используются, gcc не предупредит об этом ...

Есть ли возможность (или другой метод) проверить это?

(Конечно, я могу вручную удалить некоторые записи и попытаться снова скомпилировать, но я ищу такой подход).

Спасибо

Ответы [ 2 ]

5 голосов
/ 02 ноября 2010

Никакой GCC не предупредит об этом. В основном потому, что в большинстве случаев определить, используется член или нет, невозможно. Хорошая часть struct определена в заголовочном файле. Это может быть использовано не только вашим приложением, но и любым другим приложением, которое ссылается на ваш .lib или использует тот же заголовочный файл. Следовательно, только потому, что текущий фрагмент кода, который компилируется, не использует член, это не означает, что элемент не используется каким-либо другим фрагментом кода.

Локальные переменные разные. Легко ли их использовать, определяется компилированием только рассматриваемой функции. Следовательно, GCC и многие другие компиляторы выдают предупреждение.

3 голосов
/ 02 ноября 2010

Вы можете легально и переносимо получить доступ к первому члену структуры, не используя его имя, просто приведя структуру к типу первого члена.

typedef struct {
    int x;
} mystruct;

mystruct s;
*(int*)&s = 3;

Вы также можете переносить, но с практически 100% надежностью, доступ к любому полю в структуре без использования его имени, приведя структуру к другому типу структуры с совместимой структурой.

typedef struct {
    int x;
    char y;
} mystruct;

typedef struct {
    int a;
    char b;
} otherstruct;

mystruct s;
((otherstruct*)&s)->b = 'C';

Боюсь, это означает, что ни поиск источника по имени поля, ни его удаление не являются полностью надежными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...