constexprinline非静的変数(C ++ 17インライン変数)を意味するものではありません
は関数をconstexpr意味inlineしますが、C ++ 17インライン変数を考慮すると、非静的変数にはその効果はありません。
たとえば、私が投稿した最小限の例をとると、インライン変数はどのように機能しますか?を削除しinline、そのままにしておくとconstexpr、変数は複数のアドレスを取得します。これは、インライン変数が回避する主なことです。
constexprただし、静的変数は暗黙的にインラインです。
関数をconstexpr暗示する最小限の例inline
https://stackoverflow.com/a/14391320/895245で述べたように、の主な効果はinlineインラインではなく、関数の複数の定義を許可することです。標準引用符:C ++ヘッダーファイルに実装を含めるにはどうすればよいですか?
次の例で遊ぶことで、それを観察できます。
main.cpp
#include <cassert>
#include "notmain.hpp"
int main() {
assert(shared_func() == notmain_func());
}
notmain.hpp
#ifndef NOTMAIN_HPP
#define NOTMAIN_HPP
inline int shared_func() { return 42; }
int notmain_func();
#endif
notmain.cpp
#include "notmain.hpp"
int notmain_func() {
return shared_func();
}
コンパイルして実行します。
g++ -c -ggdb3 -O0 -Wall -Wextra -std=c++11 -pedantic-errors -o 'notmain.o' 'notmain.cpp'
g++ -c -ggdb3 -O0 -Wall -Wextra -std=c++11 -pedantic-errors -o 'main.o' 'main.cpp'
g++ -ggdb3 -O0 -Wall -Wextra -std=c++11 -pedantic-errors -o 'main.out' notmain.o main.o
./main.out
inlineから削除するとshared_func、リンクは次のように失敗します。
multiple definition of `shared_func()'
ヘッダーが複数の.cppファイルに含まれるためです。
しかし、に置き換えるinlineと、も意味するconstexprので、再び機能します。constexprinline
GCCは、ELFオブジェクトファイルでシンボルを弱いものとしてマークすることにより、これを実装します。C ++ヘッダーファイルに実装を含めるにはどうすればよいですか?
GCC8.3.0でテスト済み。