constexpr
nie oznacza inline
zmiennych niestatycznych (zmienne wbudowane w C ++ 17)
Chociaż constexpr
sugeruje to inline
dla funkcji, nie ma tego efektu w przypadku zmiennych niestatycznych, biorąc pod uwagę zmienne wbudowane w C ++ 17.
Na przykład, jeśli weźmiesz minimalny przykład, który opublikowałem pod adresem: Jak działają zmienne wbudowane? i usuń inline
, pozostawiając po prostu constexpr
, wtedy zmienna otrzymuje wiele adresów, co jest główną rzeczą, której zmienne wbudowane unikają.
constexpr
zmienne statyczne są jednak niejawnie statyczne.
Minimalny przykład, który constexpr
sugeruje inline
dla funkcji
Jak wspomniano na: https://stackoverflow.com/a/14391320/895245, głównym efektem inline
nie jest wstawianie, ale dopuszczenie wielu definicji funkcji, standardowy cytat pod adresem: W jaki sposób plik nagłówkowy C ++ może zawierać implementację?
Możemy to zaobserwować, grając na poniższym przykładzie:
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();
}
Skompiluj i uruchom:
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
Jeśli usuniemy inline
z shared_func
, link nie zadziała z:
multiple definition of `shared_func()'
ponieważ nagłówek jest dołączany do wielu .cpp
plików.
Ale jeśli zastąpimy inline
go constexpr
, to znowu działa, ponieważ constexpr
również implikuje inline
.
GCC implementuje to, oznaczając symbole jako słabe w plikach obiektowych ELF: W jaki sposób plik nagłówkowy C ++ może zawierać implementację?
Przetestowano w GCC 8.3.0.
inline
robi specyfikator. (A może źle zrozumiałem twoje sformułowanie.)