Совместное использование общих объектов - предупреждение «определено, но не используется» - PullRequest
7 голосов
/ 24 октября 2011

У меня есть несколько классов C ++, многие из которых (не все) имеют две «статические переменные размера», например:

share.h

/*Other variables in this header used by all classes*/ 

static size width=10;//Used by about 60% 

static size height = 12;//used by about 60% 

Поэтому я поместил их вЗаголовочный файл вместе с другими объектами, которые разделяют все классы.

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

Поэтому я спрашиваю, есть ли способ определить их, чтобы классы, не использующие эти две переменные, могли использовать этот заголовочный файл, не выдавая предупреждения о том, что они не определены?

Спасибо заранее

Ответы [ 3 ]

13 голосов
/ 24 октября 2011

Либо объявляйте их const, либо объявляйте их extern и определяйте их ровно в одном исходном файле.Компилятор должен ожидать, что константы будут определены (в заголовочных файлах), но не использованы, и не должны предупреждать об этом.

Определение статических переменных, которые вы не используете, часто является признаком ошибки, поэтомупредупреждение полезно в этом случае.(Если вам действительно нужны отдельные, изменяемые копии этих переменных в нескольких единицах перевода, то вам, вероятно, следует переосмыслить дизайн вашей программы).

10 голосов
/ 24 октября 2011

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

Ваша настоящая проблема в том, что это static глобальные переменные. Это означает, что каждый файл .c или .cpp, содержащий заголовок, будет иметь свою собственную копию этой переменной.

Таким образом, если у вас есть a.cpp и b.cpp, которые включают share.h, a.cpp может изменить width на 20, но b.cpp не может увидеть эффект от этого изменения. Вот почему компилятор выдает предупреждение. Потому что, если вы объявляете static size width в файле и не используете его в этом конкретном файле, то вы определенно не сможете использовать его где-либо еще . И это подозрительное поведение - определять переменную, которую вы никогда не используете.

В общем, вы никогда не должны помещать глобальные static переменные в заголовок. Если вам нужны постоянные значения, вы должны объявить их так:

const size width=10;//Used by about 60% 
const size height = 12;//Used by about 60% 

Если вы не хотите, чтобы они были постоянными, вы должны объявить их в заголовке с extern (без их инициализации), затем выбрать один .cpp файл и определить их (без *) 1032 *, но со значением). Следующим образом:

//share.h
extern size width;
extern size height;

//share.cpp
size width = 10;
size height = 12;
1 голос
/ 24 октября 2011

Вам нужно использовать квалификатор const, а не static.Смысл статики полностью отличается от вашего намерения.Вы можете найти больше информации о статике здесь http://www.cprogramming.com/tutorial/statickeyword.html.

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