GCC编译C++报control reaches end of non-void function警告如何解决
问题修复说明
警告原因
你遇到的GCC警告control reaches end of non-void function,核心问题出在addChapter成员函数的返回逻辑上:
该函数声明的返回值类型为sdds::Book&,要求所有执行路径都必须返回一个Book类型的引用,但你当前的代码仅在chapter.isValidChapter()校验通过的分支内写了return *this,如果校验不通过不进入if分支,函数运行到结束都没有返回值,属于语法层面的未定义行为。
Visual Studio默认对这类语法问题的检查阈值较低,所以不会抛出警告/错误,但GCC的默认编译规则会检查所有执行路径的返回合法性,因此触发了该警告。
修复方法
只需要调整addChapter函数的返回语句位置,把return *this移到if分支外部,保证不管章节是否添加成功,函数都有合法返回值即可。修改后的函数代码如下:
Book& Book::addChapter(const char* chapter_name, int noOfPages) { // create a new chapter Chapter chapter(chapter_name, noOfPages); // check if chapter is valid if (chapter.isValidChapter()) { // add the chapter to list of chapters // create a new list of chapters Chapter* chapters = new Chapter[this->noOfChapters + 1]; // copy chapters to new array for (int i = 0; i < this->noOfChapters; i++) chapters[i] = this->chapters[i]; // add the last chapter chapters[this->noOfChapters++] = chapter; // delete the old list of chapters delete this->chapters; // update the list of chapters this->chapters = chapters; } // 统一返回当前对象,覆盖所有执行路径 return *this; }
额外潜在问题提示
你当前的isEmpty成员函数逻辑和注释需求不符:
bool Book::isEmpty() const { // check if book is empty or invalid return (isValid || this->noOfChapters == 0); }
按注释的需求是「书籍无效 或 章节数为0」时返回true,现有逻辑写反了校验规则,可按需调整为return !isValid || this->noOfChapters == 0;。
内容的提问来源于stack exchange,提问作者Sufiyan Mustafa
相关产品推荐
相关产品推荐

