C++에서 해결 제어가 비보이드 함수 오류 끝에 도달함
이 기사에서는 제어를 해결하는 여러 방법이 무효가 아닌 함수 오류 C++의 끝에 도달하는 방법을 설명합니다.
함수 본문 끝에return
문 사용
반환 유형을 가지려면 void
가 아닌 함수가 필요합니다. 따라서 함수에는 해당 유형의 객체를 반환하는 문이 있어야합니다. 특정 컴파일러 플래그가 전달되면 이러한 유형의 오류 또는 경고가 완전히 억제 될 수 있으며, 프로그램에서 지정된 함수가 호출되면 런타임 오류가 발생합니다.
다음 예제 코드에는 문자열에 대한 참조를 가져와 문자열 값을 반환하는reverseString
함수가 정의되어 있습니다. 함수 본문을 살펴보면return
문이 없습니다. reverseString
이 호출자 함수에 인수를 전달하지 않더라도 컴파일러는 경고 메시지 만 표시하고 실행 프로그램은 어쨌든 빌드됩니다. 함수가 호출되면 제어 흐름이 분할 오류로 이어질 가능성이 높습니다.
#include <algorithm>
#include <iostream>
#include <iterator>
using std::cout;
using std::endl;
using std::reverse;
using std::string;
string reverseString(string &s) { string rev(s.rbegin(), s.rend()); }
int main() {
string str = "This string is arbitrary";
int cond = -1;
cout << str << endl;
cout << reverseString(str, cond) << endl;
return EXIT_SUCCESS;
}
함수 본문의 각 코드 경로 끝에return
문 사용
제어가 void
가 아닌 함수의 끝에 도달하는 또 다른 시나리오는 조건 블록이 모든 경로에 return
문을 갖지 않는 경우입니다. 따라서 비 void 함수의 실행이 분기되고 if
문이 가능한 모든 경로를 포함하지 않는 경우 함수 본문 끝에 명시적인 return
호출이 있어야합니다.
다음 예제는 반환 값을 호출자 함수에 전달하는 두 개의 조건부 경로가있는 문자열 조작 함수를 보여줍니다. 그러나 일부 경우는 주어진 조건에 대해 평가되지 않은 채로 남아 있으며 이는 제어 흐름이 기능 블록의 끝에 도달하여 런타임 오류를 일으킬 수 있음을 의미합니다.
#include <algorithm>
#include <iostream>
#include <iterator>
using std::cout;
using std::endl;
using std::reverse;
using std::string;
string reverseString(string &s, int condition) {
if (condition == -1) {
string rev(s.rbegin(), s.rend());
return s;
} else if (condition == 0) {
return s;
}
}
int main() {
string str = "This string is arbitrary";
int cond = -1;
cout << str << endl;
cout << reverseString(str, cond) << endl;
return EXIT_SUCCESS;
}
아래 경고가 표시될 수 있습니다.
Main.cpp:15:1: warning: non-void function does not return a value in all control paths [-Wreturn-type]
}
^
1 warning generated.
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook