컴파일시 깔끔하지 않게 하는건 뭘까요?
바로 Warning Message입니다. 자세히 보면, 버그를 유발할 확률이 높은 것들도 걸러지는데요.
이걸 놔두면 깨진창문효과처럼 점점 코드가 난잡해질 수 있습니다.
그럼 어떤 Warning들이 있는지 살펴보고 어떻게 고쳐야할지 알아보겠습니다.
warning: suggest braces around initialization of subobject [-Wmissing-braces]
문제
struct in6_addr ip = {0,};
위의 구문은 ipv6를 선언할 때 초기값을 0으로 세팅하려고 하는건데요.
이런 Warning이 뜨게 됩니다.
warning: suggest braces around initialization of subobject [-Wmissing-braces]
in6_addr 구조체는 아래와 같은 구조를 가지고 있습니다.
struct in6_addr
{
unsigned char s6_addr[16];
};
따라서 초기화할 때 {0,}라고만 하면, s6_addr 배열을 포함하는 구조체의 최상위 수준에서만 중괄호가 제공되므로, 컴파일러는 이 배열의 초기화를 보다 명확하게 하기 위해 중괄호를 더 사용하도록 권장합니다.
해결
struct in6_addr ip = {{0}};
hides overloaded virtual functions [-Woverloaded-virtual]
C++에서 파생 클래스(derived class)에서 오버로딩(overloading)된 함수가 기초 클래스(base class)의 가상 함수(virtual function)를 숨길 때 발생하는 경고입니다.
문제
class Base {
public:
virtual void func(int x) {
// 기초 클래스에서 int를 받는 가상 함수
}
virtual void func(double x) {
// 기초 클래스에서 double을 받는 가상 함수
}
};
class Derived : public Base {
public:
void func(int x) override {
// 파생 클래스에서 int를 받는 함수를 오버라이드
}
};
원인
Base 클래스에는 두 개의 func 함수가 있습니다(func(int), func(double))
Derived 클래스에서 func(int)를 오버라이드하려고 시도했습니다.
그러나 Derived 클래스에서 func(int)를 정의하면, func(double) 함수가 숨겨집니다.
파생 클래스에 func(int)를 정의하면, Base 클래스의 func(double) 함수는 더 이상 Derived 클래스에서 접근할 수 없게 됩니다. 이로 인해 hides overloaded virtual functions 경고가 발생합니다.
해결
1. using 지시어 사용
Base 클래스의 오버로드된 모든 func 함수들을 Derived 클래스에서 명시적으로 사용할 수 있도록 합니다. using 지시어를 사용하면 Derived 클래스에서 Base 클래스의 모든 오버로드된 함수를 사용할 수 있습니다.
class Derived : public Base {
public:
using Base::func; // Base 클래스의 모든 func 함수를 가져옴
void func(int x) override {
// int 인자를 받는 함수를 오버라이드
}
};
2. 모든 함수 오버라이드
또 다른 방법은 Base 클래스의 모든 오버로드된 함수를 Derived 클래스에서 오버라이드하는 것입니다. 이렇게 하면 모든 함수가 파생 클래스에서 재정의되므로 숨겨진 함수가 없습니다.
class Derived : public Base {
public:
void func(int x) override {
// int 인자를 받는 함수를 오버라이드
}
void func(double x) override {
// double 인자를 받는 함수를 오버라이드
}
};
이 방법은 모든 버전을 파생 클래스에서 재정의해야 하지만, 이로 인해 숨겨진 함수가 발생하지 않습니다.
'다양한 TIP' 카테고리의 다른 글
SSRF(Server-Side Request Forgery) LFI(Local File Inclusion) 비교 (0) | 2024.09.25 |
---|---|
온라인으로 sql 문법 확인하는 방법(sqlite, mariadb, postresql, mssql) (0) | 2024.08.26 |
QTextEdit 에 글자 그대로 덮어쓰기/추가하기 방법(append, setText, insertPlainText) (0) | 2024.08.24 |
댓글