草庐IT

static-initialization

全部标签

c++ - 为什么我们应该只在类或函数 (C++) 中使用 'static'?

我最近在阅读StroustrupsTheC++ProgrammingLanguage,在第9章有关Linkage的部分中,我看到了以下段落:"InCandolderC++programs,thekeywordstaticis(confusingly)usedtomean"useinternallinkage".Don'tusestaticexceptinsidefunctionsandclasses."问题是进一步阅读,作者没有详细说明为什么这是不好的做法。我不时在我的代码中使用静态函数,通常是为了一些在编译单元之外不需要的简单计算,但我从来没有意识到这是不受欢迎的,而且我也不清楚为什

c++ - static_cast 如何将 int 转换为 char 而不是 reinterpret_cast?

我不确定之前是否有人问过它,但我相信一定是。考虑问题开头的简单行:inta;charb=reinterpret_cast(a);我明白了reinterpret_cast将类型x的位模式解释为类型y,当然,由于大小不匹配,它不应该工作,事实上它不工作。现在考虑另一个代码:inta;charb=static_cast(a);这行得通!.现在我的问题是它是如何工作的?我的意思是编译器会砍掉这些位吗?.我确定sizeof(char).如果是,reinterpret_cast也应该通过相同的技术工作吗? 最佳答案 从int到char有一个明确

c++ - 我应该使用它还是 static_cast<void*> 然后 static_cast<myType*> 来避免重新解释?

我看到有人建议使用static_cast(static_cast(p))而不是重新解释类型转换。我不明白为什么这样更好,谁能解释一下?为了便于讨论,这里有一个需要reinterpret_cast的示例场景:DWORDlpNumberOfBytes;ULONG_PTRlpCompletionKey;LPOVERLAPPEDlpOverlapped;GetQueuedCompletionStatus(myHandle,&lpNumberOfBytes,&lpCompletionKey,&lpOverlapped,0);if(lpCompletionKey==myCustomHandlerK

c++ - -static-libstdc++ 适用于 g++ 但不适用于纯 gcc?

作为引用,我使用的是MinGW(GCC5.3)。使用编译文件时g++file.cc-static-libstdc++它静态链接C++标准库(libstdc++)并生成1.9MB的可执行文件。无论如何运行gcc-lstdc++-static-libstdc++file.cc它仍然动态链接到libstdc++-6.dll并生成一个34KB的可执行文件。为什么-static-libstdc++仅适用于g++而不适用于纯gcc? 最佳答案 GCCmanual,LinkOptions说:-static-libstdc++Whentheg++p

c++ - 为什么要经历 static_cast 的麻烦——将数字转换为 double ?

在我正在处理的代码中遇到了这个问题:doublepart2=static_cast(2)*somthing1*(static_cast(1)+something2)+(static_cast(1)/static_cast(2))*something3+(static_cast(1)/static_cast(2))*pow(something4,3);(something是doubles。)我怀疑有一个很好的理由来解决这个问题static_cast(1)之类的,但似乎我可以少打很多字。我不明白什么?提前致谢。 最佳答案 许多stati

c++ - static 关键字会影响作用域吗?

在C89中,static关键字会影响作用域吗?我的软件负责人告诉我:"Avariablemarkedstaticatthetopofafiledoesn'ttechnicallyhaveglobalscopeanylonger.Staticisascopequalifieraswellasastoragekeyword.Scopeisaconceptthatcoversvisibilityofsymbols,thoughvisibilityisautomaticallycompiledtohavestoragedurationintrinsicallytiedinbyalmostall

c++ - 如果我从不调用这个方法,我可以把 static_assert 放在类方法中吗?

这个版本根本无法编译:structA{voidfoo(){static_assert(0,"Fail");}};这个版本编译没有错误(至少在我的编译器版本中):templatestructB{voidfoo(){static_assert(x,"Fail");}};Bb;只有当我调用b.foo();时,第二个版本才编译失败,所以我想知道如果我从不调用方法,标准是否允许使用第二个版本>富?所有编译器都会以相同的方式运行吗?这不是未定义的行为吗?我想在代码中包含static_assert以在某些模板参数满足某些条件时禁止使用模板类的某些方法。static_assert的用法是否正确?我想在

C++ static const 和初始化(有没有惨败)

我在久违后重返C++,我对众所周知的静态初始化问题的理解有些磕磕绊绊。假设我有一个简单的类Vector2,如下所示(请注意,我知道x和y应该与getter和setter私有(private),为简洁起见,这些只是被省略了):classVector2{public:Vector2(floatx,floaty):x(x),y(y){};floatx,y;}现在,如果我想指定一个静态常量成员来表示x和y设置为1的Vector2,我不确定如何进行——静态常量成员是否会陷入静态初始化问题或让他们const意味着他们还好吗?我正在考虑以下可能性:可能性一://.hclassVector2{publ

c++ - 带有返回 const 引用的隐式转换运算符的类的 static_cast<> 行为

我有以下类(class)(精简后只包含相关部分):#includeclassText{private:std::string_text;public:Text(std::string&&text):_text(std::move(text)){}operatorconststd::string&()const{return_text;}};我的问题是:如果我想获得一个conststd::string&,我可以这样做而不会受到任何惩罚吗:Texttext("fred");auto&s=static_cast(text);或者这会构造一个我最终得到引用的中间std::string吗?这种情

c++ - 我们什么时候应该使用圆括号 ( ) 与 initializer { } 语法来初始化 C++11 中的对象?

这个问题在这里已经有了答案:Whentousethebrace-enclosedinitializer?(3个答案)关闭6年前。已更新我已经通过链接(例如Whentousethebrace-enclosedinitializer?)了解何时应该使用{}大括号初始化,但没有给出何时应该使用括号()的信息与初始值设定项{}在C++11/14中初始化对象的语法?建议使用哪些标准做法()在{}?在极少数情况下,例如vectorv(10,20);或autov=vector(10,20);,结果是std::vector有10个元素。如果我们使用大括号,结果是std::vector有2个元素。但这取