草庐IT

static_warning

全部标签

C++我们什么时候应该更喜欢使用两个链接的static_cast而不是reinterpret_cast

首先,这不是Whydowehavereinterpret_castinC++whentwochainedstatic_castcandoit'sjob?的拷贝.我知道我们甚至不能使用两个链式static_cast来实现的情况,reinterpret_cast所做的。但是在任何情况下我应该更喜欢两个链接的static_cast而不是简单且更具可读性的reinterpret_cast? 最佳答案 reinterpret_cast应该是一个巨大的闪烁符号,表示这看起来很疯狂,但我知道我在做什么。不要因为懒惰而使用它。reinterpret

c++ - 在 constexpr 函数中返回一个 C 字符串 : why no warning from the compiler?

考虑以下代码:constexprautof(){autostr="HelloWorld!";returnstr;}intmain(intargc,char*argv[]){staticconstexprautostr=f();std::cout我的编译器不显示任何警告是否正常?它是定义的行为吗?我能保证程序会显示"HelloWorld!"吗?我希望"HelloWorld!"不会超出函数的范围... 最佳答案 在C++中stringliterals有staticstorageduration只要程序运行就可以生存。因此,指向从f返回的

c++ - 关于 "warning C4312: ' 类型转换的问题'”

这是我的代码:HWNDWebformCreate(HWNDhParent,UINTid){returnCreateWindowEx(0,WEBFORM_CLASS,_T("about:blank"),WS_CHILD|WS_CLIPSIBLINGS|WS_VISIBLE,0,0,100,100,hParent,(HMENU)id,GetModuleHandle(NULL),0);}这是我收到的警告:warningC4312:'typecast':conversionfrom'UINT'to'HMENU'ofgreatersize这些是我的问题:为什么编译器认为转换为更大的类型是个坏主意

C++ : Why cant static functions be declared as const or volatile or const volatile

这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:C++-Whystaticmemberfunctioncan’tbecreatedwith‘const’qualifier想知道为什么静态成员函数不能声明为const或volatile或constvolatile的原因?#includeclassTest{staticvoidfun()const{//compilererrorreturn;}};

c++ - C++ 中的 static const 与 #define - 可执行文件大小的差异

我的基本情况:我有一个包含类似#definefoo(Flag1|Flags2|Flag3)的包含文件,因此它是位标志的预定义组合。为了类型安全,我想用静态常量替换这些#defines,即staticconstintfoo=(Flag1|Flag2|Flag3)(或类似的)。这个包含文件包含在程序的几十个地方。现在,当我在启用所有相关优化选项(使用VS2010的C++编译器)的情况下进行发布构建时,替换#defines似乎会使可执行文件增加几个KiB,具体取决于我替换了多少常量。为什么会这样?据我所知,如果可能的话,整数常量应该“内联”到生成的ASM代码中,我看不出如何使用staticc

c++ - 我可以从 "treat warnings as errors"中排除一些特定的警告而不禁用它们吗?

在我的VisualC++代码中,我想要/WX-“将警告视为错误”。这让我处理每个警告,包括C4996-“Xwasdeclareddeprecated”我不想解决-我现在不想更改代码,我不想禁用C4996以便它保留在输出中。所以理想情况下我想要这样的东西:#pragmawarning(ExcludeFromWX:4996)因此,当使用/WX时,除此之外的所有警告都被视为错误,并且仅显示此警告并继续编译。是否有可能得到这样的行为? 最佳答案 您可以使用以下pragma重置指定的警告。我没有测试过,你也没有提到尝试这个:更新更改警告级别应

c++ - #pragma warning 不抑制警告

我的一个.cpp文件由于第3方header生成警告C4275#include...(由于DLL导出类继承自非据我所知,DLL导出类)。我添加了一行:#pragmawarning(disable:4275)作为我的.cpp文件的第一行,但警告仍在生成。这是在VC++2008上,没有使用PCH。为什么我的#pragma不起作用,并且(除了更改第3方代码之外)我该如何解决这个问题? 最佳答案 生成一个预处理文件,您可能会发现其他一些头文件重新启用警告。 关于c++-#pragmawarning

c++ - 隐式内部链接与显式内部链接 ("static"不同)?

今天我遇到了一个特殊性,虽然可能不是很重要,但仍然让我感到困惑。也许我也没有正确理解C++。源文件中的一些数组指向字符串文字,如下所示:constchar*a[]={"a","b","c"};constchar*b[]={"d","e"};constchar*c[]={"f","g"};除了传递给GetProcAddress以从库中检索函数指针外,这些指针数组都没有以任何方式使用(这是一个非阻塞动态OpenAL/EFX/捕获函数加载器和上下文创建者/管理者)。我最终想到,我可能应该将这些变量声明为staticconst,因为在那个.cpp文件之外的任何地方都不需要它们,因此明确内部链接

c++ - 借助 static_assert 改进诊断

在模板编程中,static_assert帮助程序员检查模板参数的约束并在违反约束时生成人类可读错误消息。考虑这段代码,templatevoidf(T){static_assert(T(),"firstrequirementfailedtomeet.");static_assert(T::value,"secondrequirementfailedtomeet.");Tt=10;//eventhismaygenerateerror!}我的想法是:如果第一个static_assert失败,这意味着一些T的要求不满足,因此编译应该停止,只生成第一个错误消息——因为继续编译只是为了生成越来越多

c++ - static constexpr 指向函数的指针,编译器之间的区别

回答thisquestion时,我用gcc(codecompiled)和clang(coderejected)尝试了以下代码:typedeflong(*func)(int);longfunction(int){return42;}structTest{staticconstexprfuncf=&function;};templatestructCall{staticvoidf(){c(0);}};intmain(){Call::f();}我不确定哪个编译器是正确的,虽然我认为Test::f的constexpr初始化是可以的。错误clang输出是:error:non-typetempla