일기

2 / 23 compile flag

김치진주 2023. 2. 23. 21:09

2 / 23

 

class ClapTrap {
 string name ...
}

class ScavTrap : public ClapTrap {
 ...
 // not have member variable
}
class FragTrap : public ClapTrap {
 ... 
 // not have member variable
}

class DiamondTrap : public FragTrap, ScavTrap { ... }

DiamondTrap::DiamondTrap(const DiamondTrap &diamondTrap)
    : ClapTrap(diamondTrap), name(diamondTrap.name) {}

위 코드에서 gcc로 -Wextra 플래그를 사용했을 때 에러가난다. 

에러메세지를 보고만은 이해가 안가서, chatgpt에게 물어봤는데 ScavTrap와 FragTrap가 초기화가 안 돼서 그렇다고 한다.

그러면 기본생성자도 오류가 나야 할 것 같은데, 복사연산자에서만 일어나는게 잘 이해가 가지 않지만..

DiamondTrap::DiamondTrap(const DiamondTrap &diamondTrap)
    : ClapTrap(diamondTrap), ScavTrap(diamondTrap), FragTrap(diamondTrap), name(diamondTrap.name) {}

 

이렇게 변경하면 에러가 발생하지 않았다. 맥에서는 에러가 발생하지 않고, 내 코드 상황에서는 의미가 없는 에러같아 평가에서 문제를 제기한다면 디펜스로 넘기면 될 것 같다.

 

-Wshadow flag

-Wshadow 플래그는 섀도잉이라는걸 막는 플래그같다. 섀도잉은..

int main() {
	int a = 0;
    ...
    {
    	// in scope
    	int a = 0;
    }
}

위 코드에서  스코프 밖의 a와 스코프 안의 a는 메모리에 각각 할당된다. 다른 언어에서는 모르겠지만 이게 좋은 습관은 아니니 c++에서는 지양하라고 만든 플래그인 것 같다. 

 

-MMD -MP flag

의존성 정보가 담긴 .d 파일이 생성된다. 

foo.o: hoo.h foo.c

foo.h:

만들어진 파일을 Makefile의  include foo.d  구문으로 Makefile의 타겟으로 사용할 수 있는데,

.d 파일이 없다면 에러가 발생한다.

-include foo.d
- prefix를 사용하면 파일이 없을 때는 include하지 않아 에러가 발생하지 않는다.