constexpr
inline
statik olmayan değişkenleri ima etmez (C ++ 17 satır içi değişkenler)
İken constexpr
ima etmez inline
fonksiyonlar için, bu ++ 17 satır içi değişkenler C düşünüldüğünde statik olmayan değişkenler için bu etkisi yoktur.
Örneğin, şu adresten yayınladığım asgari örneği alırsanız: Satır içi değişkenler nasıl çalışır? ve kaldır, inline
sadece bırak constexpr
, sonra değişken birden çok adres alır, bu da satır içi değişkenlerin kaçındığı en önemli şeydir.
constexpr
ancak statik değişkenler dolaylı olarak statiktir.
İşlevleri constexpr
ifade eden minimal örnekinline
Şu adreste bahsedildiği gibi: https://stackoverflow.com/a/14391320/895245 ana etkisi inline
satır içi değil, bir işlevin birden fazla tanımına izin vermektir, standart alıntı: Bir C ++ başlık dosyası uygulamayı nasıl içerebilir?
Aşağıdaki örnekle oynayarak bunu gözlemleyebiliriz:
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();
}
Derleyin ve çalıştırın:
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
Biz kaldırırsanız inline
gelen shared_func
, bağlantı başarısız olur:
multiple definition of `shared_func()'
çünkü başlık birden çok .cpp
dosyaya dahil edilir .
Ama inline
ile değiştirirsek constexpr
, tekrar çalışır, çünkü constexpr
aynı zamanda ima eder inline
.
GCC, ELF nesne dosyalarındaki sembolleri zayıf olarak işaretleyerek bunu uygular: Bir C ++ başlık dosyası, uygulamayı nasıl içerebilir?
GCC 8.3.0'da test edilmiştir.
inline
. (Ya da belki ifadenizi yanlış anladım.)