redist셋업파일로 설치하도록 한 경우는 상관이 없지만.. 그전에 배포를 직접 파일을 포함해서 배포하는 형태였기 때문에 문제가 심각하다. XP의 경우는 폴더를 나누고 manifest를 직접 구성을 해주면 vc2005버전 dll과 vc2005sp1버전 dll을 동시에 쓸 수 있지만 2000의 경우는 manifest를 생까..; 주시기 때문에 그런식의 배포가 불가능하다..;;;
그럼 그전에 2005로 배포하고 있던 모든 dll및 실행파일을 sp1으로 통일시켜버리면 간단하지만..; 다시 싹 빌드하는데 시간도 오래걸리고 소스없는-_-(가이블..;)dll들이 있어서 피곤...;; 소스없는 dll 새버전으로 해달라고 하면 sp1에서 밖에 안된다고 안해주면 어쩌지..;
나도 이거때문에 많이 고생했는데 beta2때는 직접 폴더 뒤져서 시행착오해서 필요한 파일들 추출해서 자동압축풀림-_-으로 해서 배포했고 rtm이 되더니 C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\BootStrapper\Packages\vcredist_x86 폴더안에 인스톨본이 생겼다 인스톨쉴드를 써서 머지해도 되지만 툴을 인스톨 하지는 않으므로 걍 실행하라고 배포했다-_-
그리고 정식판이 되더니 C:\Program Files\Microsoft Visual Studio 8\VC\redist 폴더안에 crt dll들이 차곡차곡 정리되어 있다 분명 rtm에선 못본 기억인데-_- 한글판 msdn을 찾아보니 windows안에 winsxs폴더를 뒤지고 없으면 crt명과 같은 폴더명이 있으면 그안에 manifest파일을 뒤지고 거기도 없으면 실행파일과 같은 폴더에서 manifest를 뒤진다..라고 한다.
그래서 폴더째로 배포하면 그나마 깔끔하겠다...라는 생각을 하고.. 옆에 데스크탑을 xp를 깔아보고 2000을 깔아보고 하면서 테스트를 해봤는데 winsxs폴더를 뒤지거나 같은 폴더명안을 뒤지는건 xp이상에서고 그 이하에선 안된다 xp이하에서는 manifest참고 안하고 같은 폴더나 system32에서 직접 dll을 찾는다. ( 이것도 msdn에 써있는 내용이다 ) 결국 실행파일과 같은 폴더에 넣었다-_-
MFC를 안쓰고 release버전만 배포한다면 C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.CRT 안에 있는 Microsoft.VC80.CRT.manifest msvcp80.dll msvcr80.dll 만 실행파일과 같은 폴더에 넣어주면 된다. msvcm80.dll은 매니지드C++용 crt라 native를 쓰는 경우는 배포하지 않아도 된다.
아마도 표준은 아닐거라고 생각하고 2003의 지원여부는 잘 모름-ㅅ-;
이미 표준이 아니어도 vc2005의 강력한 기능이 너무나도 유용한 경우는 생까주기로 하셨슴.
override
꽤 갈망해왔던 키워드이다.
base class에 있는 virtual을 상속받아서 쓰는경우에 base class에 있는 함수를 바꾸고 drived class 의 함수를 바꾸지 않았을 때 오작동하는 잡기 쉽지 않은 버그가 컴파일할때 에러가 나주면 얼마나 감사할까... 할 때 쓰시면 된다.
struct I1 {
virtual void f();
};
struct X : public I1 {
virtual void f() override {} // OK
virtual void f2() override {} // error C3668: 'X::f2' : method with override specifier 'override' did not override any base class methods
};
abstract
virtual foo() = 0;
대신에
virtual foo() abstract;
로 쓸 수 있다.
함수에서는 별 필요 없지만 클래스에서는 강력하게 사용할 수 있다.
class X abstract {};
int main() {
X * MyX = new X; // C3622 cannot instantiate abstract class
}
이런식으로 class통째로 abstract기능을 걸 수 있다.
인터페이스 class를 만들 때 유용할 듯...이라고 생각할 수 있지만 인터페이스 클래스는 __interface키워드가 있으므로 걍 추상 클래스에만 사용하쟈...
사실 인터페이스용으로 사용해도 내용으로는 구분이 안되는 내용이지만 알아서 구분해 쓰쟈
__is_abstract(type) 으로 컴파일 타임 체크 가능
__interface
__interface I1 {
virtual void f();
};
위의 abstrace키워드로 선언한 class와의 차이
멤버변수를 가질 수 없다.
static류를 사용할 수 없다.
생성자, 파괴자, 오퍼레이터 오버로딩 불가(엑-.ㅜ 인터페이스 클래스에서 이거 꽤 쓰는데..;;)
인터페이스는 상속 가능, base class는 상속 안됨
public pure virtual함수만 가질 수 있음
장점은 virtual table을 차지하지 않음
sealed
더이상 오버라이딩 못하게 할 때 사용한다.
함수와 클래스 둘 다 사용가능
__is_sealed (type) 으로 컴파일 타임 체크 가능
.끝.
native 기준이고 clr에서만 사용가능한건 적지 않았음
위에 몇 개 나왔지만 __is_abstract같은 컴파일 타임에 사용가능한 TypeTraits가 꽤 있다.
특정 클래스가 base클래스를 상속받았는지를 체크하는것도 있고(clr에서만 되지만)
__has_copy(type)나 __has_assign(type)같은
native에서 쓸만한것도 꽤 있다.
근데 사실 TypeTraits는 필요한건 native지원안하면 loki를 써버리면 그만이라 헹~