constexprinlinestatik olmayan değişkenleri ima etmez (C ++ 17 satır içi değişkenler)
İken constexprima etmez inlinefonksiyonlar 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, inlinesadece 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 constexprifade eden minimal örnekinline
Şu adreste bahsedildiği gibi: https://stackoverflow.com/a/14391320/895245 ana etkisi inlinesatı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 inlinegelen shared_func, bağlantı başarısız olur:
multiple definition of `shared_func()'
çünkü başlık birden çok .cppdosyaya dahil edilir .
Ama inlineile değiştirirsek constexpr, tekrar çalışır, çünkü constexpraynı 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.)