Примите во внимание следующее:
// 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
?
Что такое «ожидаемый» ответ компилятора?Предупреждение или нет?Я не ожидал бы какого-либо определенного, но неиспользованного предупреждения для констант в заголовке, которое любой мог бы включить, чтобы иметь доступ к ним (поэтому нет смысла априори предупреждать о неиспользовании)