constexpr
inline
非静的変数(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
ので、再び機能します。constexpr
inline
GCCは、ELFオブジェクトファイルでシンボルを弱いものとしてマークすることにより、これを実装します。C ++ヘッダーファイルに実装を含めるにはどうすればよいですか?
GCC8.3.0でテスト済み。