草庐IT

c++ - 头文件和 odr 中的 constexpr 全局常量

不幸的是,我对constexpr、头文件中声明的全局常量和odr感到有些困惑。简而言之:我们可以从这里得出结论吗https://isocpp.org/files/papers/n4147.pdf那个constexprMyClassconstMyClassObj(){returnMyClass{};}constexprcharconst*Hello(){return"Hello";}优于constexprMyClassconstkMyClassObj=MyClass{};constexprcharconst*kHello="Hello";用于在头文件中定义全局变量如果我想“只使用”那些全

c++ - 如何定义C结构: c-linkage and udt

我用C-ABI接口(interface)用X语言编写了dll。我想在我的C++程序中使用这个C-ABI。我在main.cpp中这样写:extern"C"{structFoo{constchar*constdata;unsignedlen;};structFoof(void);}intmain(){}并得到编译器的警告(visualc++/15.7.5/windows7/32bit):(7):warningC4190:'f'hasC-linkagespecified,butreturnsUDT'Foo'whichisincompatiblewithC(7):note:seedeclara

C++ block scope extern declaration linkage,混淆C++标准解释

标准N3242(C++11草案)和N3797(C++14draft)两者有相同的段落。§3.5Programandlinkage[basic.link]¶6Thenameofafunctiondeclaredinblockscopeandthenameofavariabledeclaredbyablockscopeexterndeclarationhavelinkage.Ifthereisavisibledeclarationofanentitywithlinkagehavingthesamenameandtype,ignoringentitiesdeclaredoutsidethei

c++ - 铿锵错误 : non-type template argument refers to function that does not have linkage -- bug?

我有一些非常简单的(C++11)代码,最新的clang(version3.4trunk187493)无法编译,但GCC编译正常。代码(下面)实例化函数模板foo使用局部函数类型Bar然后尝试将其地址用作类模板Func的非类型模板参数:templatestructFunc{};templateexterninlinevoidfoo(){usingFoo=Func>;}intmain(){structBar{};//function-localtypefoo();return0;}clang发出以下错误:error:non-typetemplateargumentreferstofunct

C++ 标准 : do namespace-scoped constexpr variables have internal linkage?

假设我们有一个标题foo.h包含以下内容:#ifndefFOO_H_#defineFOO_H_namespacefoo{constexprstd::string_viewkSomeString="blah";}#endif//FOO_H_foo::kSomeString是否保证在包含foo.h的任何翻译单元中具有内部链接?这在C++11和C++17之间是否有所不同?在标准草案中[basic.link]/3说Anamehavingnamespacescopehasinternallinkageifitisthenameof[...]anon-inlinevariableofnon-vol

c++ - std::piecewise_construct 不会导致 ODR 违规吗?

std::piecewise_construct,在中定义,具有内部链接,因为它被声明为constexpr。我想知道在header中使用std::piecewise_construct是否会违反ODR。例如:a.hpp#include#includestructpoint{point(intx,inty):x(x),y(y){}intx,y;};inlinestd::pairf(intx1,inty1,intx2,inty2){return{std::piecewise_construct,std::forward_as_tuple(x1,y1),std::forward_as_tup

c++ - std::piecewise_construct 不会导致 ODR 违规吗?

std::piecewise_construct,在中定义,具有内部链接,因为它被声明为constexpr。我想知道在header中使用std::piecewise_construct是否会违反ODR。例如:a.hpp#include#includestructpoint{point(intx,inty):x(x),y(y){}intx,y;};inlinestd::pairf(intx1,inty1,intx2,inty2){return{std::piecewise_construct,std::forward_as_tuple(x1,y1),std::forward_as_tup

c++ - 为什么模板不能在 extern "C" block 内?

这是ananswer的后续问题。至Isitpossibletotypedefapointer-to-extern-“C”-functiontypewithinatemplate?此代码无法使用g++、VisualC/C++和ComeauC/C++编译,错误消息基本相同:#includeextern"C"{staticintdo_stuff(int){return3;}templatestructtest{staticvoidfoo(return_t_(*)(arg1_t_)){}};}intmain(){test::foo(&do_stuff);returnEXIT_SUCCESS;}

c++ - 为什么模板不能在 extern "C" block 内?

这是ananswer的后续问题。至Isitpossibletotypedefapointer-to-extern-“C”-functiontypewithinatemplate?此代码无法使用g++、VisualC/C++和ComeauC/C++编译,错误消息基本相同:#includeextern"C"{staticintdo_stuff(int){return3;}templatestructtest{staticvoidfoo(return_t_(*)(arg1_t_)){}};}intmain(){test::foo(&do_stuff);returnEXIT_SUCCESS;}

c++ - c&c++默认全局变量链接,多重声明&定义问题

例如:code1.c/.cppinta;//...andsooncode2.c/.cppinta;intmain(void){return0;}去编译:$gcccode1.ccode2.c#thisisfine$$g++code1.cppcode2.cpp#thisisdead/tmp/ccLY66HQ.o:(.bss+0x0):multipledefinitionof`a'/tmp/ccnIOmPC.o:(.bss+0x0):firstdefinedherecollect2:ldreturned1exitstatusC和C++之间有没有全局变量链接的区别?