- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如果我有一个基于切换 enum class
返回的函数, gcc 发出 warning: control reaches end of non-void function [-Wreturn-type]
.示例代码:
enum class Test { a, b, c } ;
int foo(Test test) {
switch (test) {
case Test::a: return 0;
case Test::b: return 1;
case Test::c: return 2;
}
}
我想到了两种解决方案,但似乎都不正确:
1) 有一个抛出的默认情况。但是,当我向 enum class
添加其他成员时我不再收到我错过案例的错误消息。
2) 用 pragma 抑制警告,但我不会防范有人传入 static_cast<Test>(123)
.
所以我的问题是,如何处理切换 C++11 枚举类的 -Wreturn 类型错误?
最佳答案
通常我会在开关之后放置一些东西,无论是throw something()
还是return -1
。您需要确保在运行时,无论发生什么情况,对该函数的调用至少是安全的。您的编译器告诉您的也是如此。
例子:
enum class Test { a, b, c } ;
int foo(Test test) {
switch (test) {
case Test::a: return 0;
case Test::b: return 1;
case Test::c: return 2;
}
throw std::runtime_error("Unhandled Test enumerator " + std::to_string((int)test) + " in foo()");
}
理想情况下,您的客户永远不会看到这一点,但如果他们看到了(通过您的顶级 catch
— 您有一个,对吧?),您会立即知道问题所在并可以解决
此外(但不仅仅是)我会考虑放置一个调试断言,如 assert
(或特定于项目的等效项),以便在开发过程中检测到此错误。 (不过,在上面使用 try
的示例中,这实际上会阻止生成有用的错误消息,因此它并不总是合适的。)
此外,如果您打开 -Werror
然后无法将项目添加到 switch
,您的项目将不会构建,以便从源头解决问题(字面意思!)。
一般来说,不要忽略或试图抑制警告:留意它们!
关于c++ - 如何处理 -Wreturn-type 以切换 C++11 枚举类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53282722/
好的,我有一个 C 语言的代码。它是零和十字。但我不知道我的'sprawdzenie'(检查)。IDE 向我发送控制可能会到达非空函数 [-Wreturn-type] 的结尾。我不知道出了什么问题,但
我在功能方面遇到了一个小问题。我相信这可能是因为我没有正确使用它们。我的代码如下: int duration(string fraction) { // X part of the fract
我写了一段代码: int gnrt(vector vect, int n) { std::vector :: iterator it; it = find(vect.begin()
我正在尝试编译 Model 5.0在 OS X 10.8.3 下编译时我收到很多警告和错误。其中一些错误类似于 xwin.c:31523:2: error: non-void function 'sc
我正在尝试创建一个简短的线性搜索算法,但不断收到错误消息控制可能到达非空函数结尾-wreturn-type。我知道该错误与将返回值放在循环之外有关,但是如何从循环中获取返回值呢? 这是代码: bool
这个问题在这里已经有了答案: Returning array declared in function returns address of local variable in C? (4 个答案)
我正在开发一个简单的程序,它将获取给定变量的内存地址,最多 64 位(unsigned long)。目前这是我的代码,但出于某种原因,编译器向我发出警告,说我的方法正在返回局部变量的地址,而这正是我想
根据 GCC 手册,-Wreturn-type 选项通过 -Wall 启用。但是,我找不到在保持 -Wall 的其余部分启用的同时禁用它的正确方法。 考虑这段代码: func() {} 如果在没有警告
我在 gcc ,它给了我一个警告,我忘记了函数中的返回值 Wreturn-type . 但是,我不希望它是一个警告,我希望它是一个实际的编译器错误。有没有办法在 Wreturn-type 时停止编译是
我有这个,当我尝试编译时,终端给我错误;有人可以帮助我吗? int e=0; float func(float x, float y, float z) { e++; if((x*
我在一个编译器上编写了一个调度程序。当我在 Debian 9 Linux 上编译时,一切正常,但是当我尝试在运行 macOS 的 Mac 上编译时,它会显示很多警告和此错误: error: non-v
考虑以下简单代码: struct Base { Base() = default; Base(const Base&); Base(Base&&); }; struct
如果我有一个基于切换 enum class 返回的函数, gcc 发出 warning: control reaches end of non-void function [-Wreturn-type
我是一名开始学习 C 的 Linux 用户,我正在尝试编译我输入的源代码: #include main() { float c,d; c = 10215.3;
Visual Studio 是否有相当于 GCC 的 -Wreturn-type 的警告(或警告)? ? 更具体地说,我正在寻找一个 Visual Studio 警告(或多个警告),它会针对返回类型不
C语言编程 代码: struct battleship makeShip (int size, int pos) { int i, j; int* body; body = (
我有一段代码: int check(int d, char arr[9][9], int rep_arr[45][3]) { int p = findProb(d, arr, rep_arr,
我有一段代码: int check(int d, char arr[9][9], int rep_arr[45][3]) { int p = findProb(d, arr, rep_arr,
错误信息在标题中。有谁知道怎么了?我想清除这个警告。我一无所知。 const std::string loadShaderFromFile(std::string shaderFilePath)
我在编译时遇到这个错误,并在此处检查了其他问题,但没有进一步的进展: funciones.c: In function ‘Lyapunov’: ../funciones.c:55:2: warning
我是一名优秀的程序员,十分优秀!