Предупреждение g ++ «определено, но не используется» в глобальном const, в зависимости от флагов оптимизации - PullRequest
0 голосов
/ 18 сентября 2018

Примите во внимание следующее:

// headher h.h
#pragma once
namespace foo {
    const float c1 = 0.22;
    inline float f() {  return c1; }
    const float c2 = f();
    const float c3 = 0.33;
}
// source lib.cpp
#include "h.h"    

Создайте общую библиотеку с помощью:

g++ -Wall -O2 -fPIC -shared -Wl,-soname,libme.so -o libme.so lib.cpp

Компилятор (5.4.0) жалуется на:

h.h:9:13: warning: ‘foo::c2’ defined but not used [-Wunused-variable]

Почему предупреждение? У них нет внешней связи?

Почему только c2?Нет предупреждения о c3.

Обратите внимание, что предупреждение исчезает без флагов оптимизации (-O0) (?!?)

(я знаю, что мог бы использовать constexpr,но в реальном коде я мог бы иметь не-литеральный тип, поэтому constexpr не годится)

РЕДАКТИРОВАТЬ:

Хорошо, в C ++ есть внутренняя связь (спасибо Ричарду Криттену).Но мои вопросы остаются:

Почему появляется предупреждение о c2, а не о c3?

Что такое «ожидаемый» ответ компилятора?Предупреждение или нет?Я не ожидал бы какого-либо определенного, но неиспользованного предупреждения для констант в заголовке, которое любой мог бы включить, чтобы иметь доступ к ним (поэтому нет смысла априори предупреждать о неиспользовании)

...