'분류 전체보기'에 해당되는 글 81건

  1. 2006/08/22 Dr.Watson (4)
  2. 2006/08/11 증분링크 (2)
  3. 2006/08/03 VS2005으로 작성한 코드가 다른 컴퓨터에서 작동을 안할때.. (2)
  4. 2006/08/01 최적화(Optimization)
  5. 2006/07/29 컴퓨터 견적... (4)
  6. 2006/07/27 재밌는 코드... (7)
  7. 2006/07/11 시계 (4)
  8. 2006/06/28 switch문의 비밀(?) (2)
  9. 2006/06/22 Header file 에 관해서... (4)
  10. 2006/06/21 warning C4996: deprecated... (2)

Dr.Watson
2006/08/21 19:07

Dr.watson을 이용하여 에러가 발생하는 곳을 찾아보자.

먼저 윈도우 98에서는 drwatson.exe를 실행시키면 되고 이렇게 만들어진 추적 파일은 \Windows\Drwatson 폴더에 .wlg 파일로 저장된다.
NT계열에서는 drwtsn32를 실행시키고 C:\Documents and Settings\All Users\Application Data\Microsoft\Dr Watson 에 .log 파일로 저장된다.

Dr. Watson 설정
시스템은 레지스트리 편집기의 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug

Auto 항목이  1 이면 시스템이 자동으로 디버거를 시작하고 메시지 상자를 만들지 않는다.
시스템에 Windows가 설치된 경우 Auto 항목의 값은 기본값 1로 설정되고 Debugger 항목의 값은 Dr. Watson을 시작하는 명령을 지정한다. 이는 프로그램 오류가 발생했을 때 Windows용 Dr. Watson이 자동으로 오류를 진단하고 해당 진단 정보를 로그에 기록
하지만 NET이 설치되면 값은 아래와 같이 설정된다.

NET경우일때 registry값
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug]
"Auto"="0"
"Debugger"="\"C:\\WINDOWS\\system32\\vsjitdebugger.exe\" -p %ld -e %ld"
"UserDebuggerHotKey"=dword:00000000

VC++ 6.0 일때
"Debugger"="C:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin\msdev.exe" -p %ld -e %ld

Dr.Watson을 설정하고 나서...
예제로 아래와 같이 NULL 포인터에 값을 대입하면 예외가 발생한다.
char* pch1 = NULL;
...
*pch1 = 0;
...
delete pch1;

그럼 윈도우는 아래와 같은 오류보고 창을 띄운다. 오류 보고를 하면 MS로 오류보고 되지만 보내지 않을경우 log와 dump를 남기게 된다. dump 파일에 대한 이야기는 나중에 하고 오늘은 log를 보자.



아래 로그 파일을 보면...
"401867 이라는 주소에 오류->" 라고 표시한곳을 볼수 있다. 이곳이 에러(예외)가 발생한곳인데..
이 주소를 가지고 우리는 우선 2가지를 짐작할수 있다.
첫번째는 0x00400000 으로 시작되는 주소로 보아 EXE 파일(DLL은 0x10000000)이라는 점하고
두번째는 에러가 발생한 지점이 1867 이라는 곳이다.
그럼 소스코드에서 에러가 발생한 지점을 어떻게 알수 있을까?

로그 보기 펼치기..

빌드시 아래의 그림처럼 MAP 파일을 생성하자.
Project Options에 /mapinfo:lines 도 추가해준다.

그러면 우리는 아래와 같은 MAP 파일을 얻을수 있다.

Line numbers for .\Debug\dumptestDlg.obj(D:\project\dumptest\dumptestDlg.cpp) segment .text

  41 0001:000002f0    44 0001:00000322    53 0001:00000380    64 0001:000003b0

중간생략

  162 0001:000007e6   164 0001:000007ee   169 0001:00000810   170 0001:0000082d
  171 0001:00000833   175 0001:00000840   177 0001:0000085d   179 0001:00000864
  181 0001:0000086a
  183 0001:0000087c

401867 - 400000 - 1000 = 867 이라는 주소는 179 와 181 사이에 있다.
즉 코드의 179와 181 사이에서 에러가 발생했다는것을 알수가 있다.

실제로 해본결과 Project Options에 Optimizations(Maxmize speed /O2 Minimize Size / O1)  옵션을 추가했을경우 제대로된 log 파일을 얻을수 없었다.

Release 빌드시 위의 옵션 이외의 Default(/D) 옵션으로 해도 지장이 있을지 없을지는 아직 모르겠다. (Reversing이나 해킹방지차원에서)

참고서적 Debugging Applications for .NET and Windows - John robbins
그외에 유경상님 블러그, 정성태님홈피

이올린에 북마크하기
2006/08/21 19:07 2006/08/21 19:07
Trackback Address :: http://hongyver.pe.kr/ttblog/trackback/615

  • TWEETY 2006/08/21 20:57  댓글주소  수정/삭제  댓글쓰기
    저 책에 이런 내용이 있어요? ㅋㅋㅋ
    난 왜 못봤지? 너무 뜨문뜨문 봔나?

    난 지금 컴터가 맛가서 testPC에다가 연결해서 놀구 있어요.ㅜㅜ
    미치겐네.. 할 일이 산더민데... as기사는 언제올까..
  • 정성태 2006/08/21 21:20  댓글주소  수정/삭제  댓글쓰기
    "로그 보기" 의 링크가 ^^ 잘못된 것 같습니다.

    참고로, VS.NET 2005 (VC++ 8.0) 에서는 LINE INFO 를 생성하는 것이 아예 없어졌답니다. ^^
    • hongyver 2006/08/21 21:26  댓글주소  수정/삭제
      내용이 길어 more.../less... 버튼처리했습니다.
      누르면 아래로 쫘악...

      line info 생성이 없어졌다는건 옵션만 없어지고 디폴트로 생성된다는뜻인가요? 아님...
      아예 그런 기능이 없어졌다는 뜻인가요?
  • 데카원 2010/02/18 13:22  댓글주소  수정/삭제  댓글쓰기
    발*기부전 // 데카원
    ■한국인 체질에 맞는 생약초.허브 고농축 성*기능 강*화 제품 (미국FDA분류)
    미국최고의 기술진에 의한 발*기부전퇴치의 일대 혁명 ! 신제품 ! : 데카원
    1알 복용으로 3-4일 지속, 강직도.발기력 비아그라보다 4배 이상

    -초강력 발#기 가능!! 40분 이내 발#기 강력 유지!! *부작용 제로!!


    => http://www.yy44.us.tc/ 방문인터넷 : http://www.yy44.us.tc

    ■음주 후 발*기가 안되면 Deca-one (데카원)을 찾으십시오!!
    -기회를 놓치지 마시길~ 데카원은 반드시 결과가 나옵니다!

    한국내전화요금으로 미국직통 013-0299-7056, 미국내직통: 0011-215-421-8766
    구매상담.문의.한글 문자메시지 주문가능 013-0299-7056,

  • 증분링크
    2006/08/10 20:40

    증분링크(incremental link)는 바이너리를 가능한 빠르게 링크하고자 함수 호출시 직접적인 주소를 참조하지 않고 별도의 테이블(ILT, 증분링크테이블)로 관리를 하여 함수가 수정되어 크기가 변하여도 모든 CALL 명령을 찾아 수정을 가하는게 아니고 테이블만 변경할수 있도록 하여 링크 속도를 높인다.

    ILT 테이블 예
    @ILT+0(_wmain):
    00401005 jmp wmain(401070h)
    @ILT+5 (??_GCResString@@UAEPAXI@Z)
    0040100A jmp CResString::'scalar deleting destructor' (401B40h)

    증분링크시 추가적인 패딩데이타가 실행파일에 추가되어 용량이 커진다.

    /INCREMENTAL:yes 또는 no로 설정할수 있고 이와 관련된 정보는 .ilk에 저장되어 사용된다.

    디버그 모드에서 실행중 수정하면서 진행하려면 증분링크로 빌드되어야 한다. (VS에서는 /DEBUG 시 자동적으로 /INCREMENTAL 이 지정된다.)

    그외에 /OPT:REF /OPT:ICF 를 선택하면 증분링크는 무시되고 비증분링크를 수행한다.

    API Hooking시 증분링크에 대한 체크가 필요하다.

    // 증분 링크 체크
    // Microsoft Visual C++은 실행중에도 코드를 수정할 수 있게끔
    // 증분 링크를 사용하여 함수의 주소가 실제 함수를 가리키지 않고, 실제 함수로 jmp 하는 명령의 주소로 되어 있다.
    // 참고: System DLL일 경우에 무시
    if ((DWORD)fnApi < 0x80000000 && *(PBYTE)fnApi == 0xE9)
    {
      fnApi = (PROC)((int)(fnApi) + (*(int *)((PBYTE)fnApi+1)) + 5);
    }

    이올린에 북마크하기(0) 이올린에 추천하기(0)
    2006/08/10 20:40 2006/08/10 20:40
    Trackback Address :: http://hongyver.pe.kr/ttblog/trackback/610

  • 윤제석 2006/08/11 10:42  댓글주소  수정/삭제  댓글쓰기
    홍선임님 그럼 해결책을 찾으셨내요!!

  • VS2005으로 작성한 코드가 다른 컴퓨터에서 작동을 안할때..
    2006/08/02 22:18
    이런 황당할때가...
    간단한 코드를 테스트하려고 VS.NET으로 작성한 MFC가 다른 VS.NET이 설치되지 않은 컴퓨터에서 작동하지 않는다.
    라이브러리를 복사해도 마찬가지고...

    응용 프로그램 구성이 올바르지 않기 때문에 이 응용 프로그램을 시작하지...

    혹은 msvcr80.dll 를 찾을수 없다는 에러가 난다면...

    해결방법 :

    1. VS.NET용 라이브러리
    릴리즈 버전은
    C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86
    디버그 버전은
    C:\Program Files\Microsoft Visual Studio 8\VC\redist\Debug_NonRedist
    에서 CRT, MFC, ATL에 맞는 dll을 실행파일과 같은 경로명에 복사해주면 된다.
    (Microsoft.VC80.*.manifest 도 포함해서)

    2. C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\BootStrapper\Packages\vcredist_x86 또는

    http://www.microsoft.com/downloads/details.aspx?FamilyID=32bc1bee-a3f9-4c13-9c99-220b62a191ee&DisplayLang=ko

    자신에 맞는(x86등등) 것을 다운받아서 설치하면 된다.


    원인 :

    Windows XP에서는 DLL Hell[각주]새로운 프로그램을 설치할때 다른 프로그램이 사용하는 DLL을 덮어 쓰거나 혹은 버전의 불일치로 오는 문제로 기존의 프로그램들이 제대로 동작하지 않는 경우가 있다.[/각주]을 빠져나가려고 Side-by-Side Assembly라는 개념을 만들었다. 이건 여러 버전의 DLL을 동시에 시스템에 존재할 수 있게 해주고, DLL을 사용하는 응용프로그램이 원하는 DLL 버전을 골라서 쓸 수 있도록 해주는 방법이다.
    SideBySideAssembly 의 강력한 점은 응용프로그램에서 직,간접적으로 로드하는 모든 DLL이 이 설정의 영향을 받는다는 것이다. 이전에는 응용프로그램이 로드한 DLL에 의해서 간접적으로 로드되는 DLL을 제어할 수 있는 방법이 없었다.

    이러한 새로운 방식으로 기존방식대로 VS.NET 라이브러리를 복사하는것으로 끝나지 않고 배포를 위한 별도의 작업이 필요하게 된다.

    문제 해결에 대한 페이지
    http://www.serious-code.net/moin.cgi/RedistributingVisualCppRunTimeLibrary
    http://www.codeproject.com/cpp/vcredists_x86.asp
    http://cafe.naver.com/solidcode.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=8
    이올린에 북마크하기(0) 이올린에 추천하기(0)
    2006/08/02 22:18 2006/08/02 22:18
    Trackback Address :: http://hongyver.pe.kr/ttblog/trackback/603

  • TWEETY 2006/08/03 20:09  댓글주소  수정/삭제  댓글쓰기
    VS 7.0부터 이런 일이 일어났던 거죠?
    괜히 7.0으로 개발했다가...
    한 참을 고생한 기억이 있어요.
    그 놈은 msvcr70.dll이 원인이었죠.
    찾아내는라 죽는 줄 알았음..-_-;;;
    PE?? 그런거 뒤져가지고 알아냈었어요. ㅠㅠ;
    • hongyver 2006/08/03 20:43  댓글주소  수정/삭제
      dll 이 문제가 아니라...
      CRT나 MFC,ATL의 배포라이브러러리를 같이 배포해도 예전같으면 같은 경로명에 있어도 실행이 당연 됐는데...
      그게 안되더라구...
      별도의 배포용 파일(vcredist_x86.exe)를 실행해주어야 한다는 사실...
      귀찮아 졌으...

  • 최적화(Optimization)
    2006/07/31 20:21
    비주얼스튜디오에서 릴리즈모드시 최적화 옵션은 Maxmize Speed(/O2)로 설정되어 있다.
    최종 컴파일시 실행코드를 가장빠른 코드로 실행 되도록 컴파일 하겠다는건데...
    아래의 예제를 보자...

    for ( int i = 0; i < 100; ++i )
    {
        j = sqrtf( 0.5f ) * function(1.0, 2.0);
      // 다른 작업수행
    }
    최적화 옵션을 키고 컴파일을 수행한다면...
    j = sqrtf( 0.5f ) * function(1.0, 2.0);
    for ( int i = 0; i < 100; ++i )
    {
      // 다른작업 수행
    }


    j의 값이 for문 내부에서 변하지 않으니 for문 밖에서 한번의 계산을 수행하여 속도를 높이겠다는 의도인데...
    만약 function 내부에서 j값을 참조하여 값이 변한다거나 다른 Thread에서 j값을 참조한다거나 하면...(과장된 가정이긴하다...)
    의도와는 달리 배는 산으로 간다...

    늘 그렇듯이 최고가 능사는 아니다 싶다...
    최적화옵션은 써야하고 그러한 문제를 방지하고 싶다면 volatile 라는 키워드를 사용하면 된다.
    volatile int j; 라고 선언하면 된다.
    이올린에 북마크하기(0) 이올린에 추천하기(0)
    2006/07/31 20:21 2006/07/31 20:21
    Trackback Address :: http://hongyver.pe.kr/ttblog/trackback/588


    컴퓨터 견적...
    2006/07/28 11:15

    어머니 성화에 못 이기는척...하면서 은근슬쩍 내가 원하는 사양을...
    대충 골라 보니...

    인텔 코어 2 듀오 [각주]이른바 콘로, 펜티엄이란 이름은 이제 프로세서 시장에서 사라진다. 10년간 데스크탑PC 의 프로세서용으로 많은 모델을 출시한 펜티엄은 펜티엄D를 끝으로 [코어2듀오]란 이름의 새로운 프로세서로 대체된다.[/각주]E6400 [2.13Ghz, FSB 1066MHz, L2 2MB]
    아수스(에스티컴) P5W DH Deluxe 콘로 [Core 2 Duo][Intel 975x, LGA775]
    디지웍스 2GB DDR SDRAM [각주]콘로의 성능을 제대로 끌어내기 위해서는 DDR2 800의 램을 사용하면 좋다.[/각주][PC6400, DDR800]
    웨스턴디지털 WD 1600JS 160GB SATA2[각주]IDE방식에서 SATA방식으로 단순히 속도만 빨라지는게 아니다. Plug&Play도 지원[/각주] 8MB [7200rpm]
    삼성전기 3.5인치 FDD SFD-321B/LBL2 [블랙]
    아수스(에스티컴) 지포스 EN6600 TD 256MB 128bit [PCi-E]
    LG 플래트론 L1740PQ
    LG전자 16X DVD-ROM GDR-8164B
    마이크로닉스 ML-10 올블랙 [파워별도,ATX]
    ZM 360B-APS
    앤디코 AiO 이지랙 300 블랙 (5.25인치 베이 장착형)
    넷메이트 NMU702 Plus (3.5  내외장 카드리더기/XD지원)
    직접 조립을 할까? 이만원주고 조립을 해달라고 할까?
    목하 고민중...

    포토샵이고 뭐고 막 날라다닐듯 해서...
    컴퓨터 본체 근처에 방충막을 쳐야겠어...
    이올린에 북마크하기(0) 이올린에 추천하기(0)
    2006/07/28 11:15 2006/07/28 11:15
    Trackback Address :: http://hongyver.pe.kr/ttblog/trackback/598

  • maro 2006/07/31 01:52  댓글주소  수정/삭제  댓글쓰기
    이제 팬티엄은 없구나 .. 우후훗
    하드에 관심 끊은지 언~~~ 수억년
    뭔소린지 암것도 몰것당 @.@
  • maro 2006/08/01 03:43  댓글주소  수정/삭제  댓글쓰기
    아하하핫 .. 알려주삼

  • 재밌는 코드...
    2006/07/26 19:52
    직업이 직업이다보니...
    남이 작성한 코드를 보다가 실로 경악을 금치못하는 코드를 볼때...
    난 썅칼라[각주][감탄사] 놀랍거나 혹은 일이 잘 안풀린데 하는말. 유사단어로 제기랄, 젠장, 된장등이 있음 [/각주]를 외친다...

    + swap 할때 temp 변수가 꼭 필요할까?
    void swap(int &a, int &b)
    {
      a = a + b;
      b = a - b;
      a = a - b;
    }
    XOR 를 이용하면 더 좋다.
    void swap(int &a, int &b)
    {
      a ^= b ^= a ^= b;
    }


    +  주석처리
    번갈아 가면서 테스트 해야할때 아래처럼 주석처리 해놓으면...
    //*/
    int a = 10;
    /*/
    int a = 20;
    //*/
    아랫줄이 필요하다면...
    /*/
    int a = 10;
    /*/
    int a = 20;
    //*/


    + 리턴값으로...
    if((code >= KEYCODE_0) && (code <= KEYCODE_9))
    {
      if(ShiftKeyPressed())
      {
           return ")!@#$%^&*("[code - KEYCODE_0];
      }
      else
      {
           return '0' + (code - KEYCODE_0);
      }
    }



    아! 머리좋은 인간들이여...코딩하지말고 정치해라...

    이올린에 북마크하기(0) 이올린에 추천하기(0)
    2006/07/26 19:52 2006/07/26 19:52
    Trackback Address :: http://hongyver.pe.kr/ttblog/trackback/596

    1. Subject: 코드 주석 처리 팁

      Tracked from RERIC.COM 2006/07/26 20:27  삭제

      두 개의 서로 다른 코드로 테스트 할 때 유용하다. /**/ Run here /*/ code /**/ /** code /*/ Run here /**/ via http://eclipsians.net/more.php?id=37_0_1_10_M //*/ Run here /*/ code //*/ //* code /*/ Run here //*/ via http://hongyver.pe...

  • TWEETY 2006/07/27 00:49  댓글주소  수정/삭제  댓글쓰기
    return ";)!@#$%^&*("[code - KEYCODE_0];

    이게 모에요??? -.-a
    • hongyver 2006/07/27 01:02  댓글주소  수정/삭제
      "!@#$%^&*("[0] = !
      "!@#$%^&*("[1] = @

      즉 "!@#$%^&*(" 는 배열의 포인터고..
      배열[n] 번째 값을 취한다는거지...
  • 우스 2007/01/31 10:24  댓글주소  수정/삭제  댓글쓰기
    썅칼라!!!!!!!!!!!!!!!!!!!!!!!!!!! 우와~~~~
  • 김순철 2007/03/03 20:05  댓글주소  수정/삭제  댓글쓰기
    어허! 좋은 내용이네요. 퍼가도 되죠? 퍼갈께요~
  • 구루마루 2008/11/25 22:16  댓글주소  수정/삭제  댓글쓰기
    이야.. 마지막 부분은 생각도 못했던 코드군요.

  • 시계
    2006/07/11 05:13

    바코드 시계 너무 맘에 드는걸?
    손목시계로 나온다면 구매할 용의 있음.


    이런 시계도 있다우...

    근데 왜 자바코드는 안붙을까? 흠
    이올린에 북마크하기
    2006/07/11 05:13 2006/07/11 05:13
    Trackback Address :: http://hongyver.pe.kr/ttblog/trackback/586

  • maro 2006/07/12 19:09  댓글주소  수정/삭제  댓글쓰기
    바코드시계 ... 맨유에서 지성씨한테 칩 넣는 것 같은 기분
  • maro 2006/07/13 19:12  댓글주소  수정/삭제  댓글쓰기
    맨유에서 선수들에게 칩을 살짝 심어서
    효과적인 훈련을 체크한다고 발표했었어욤
    축구하는 기계를 만들려하는건지 ....

    바코드를 보면 그런쪽으로 생각이 흘러서 훔훔훔
    • hongyver 2006/07/13 19:28  댓글주소  수정/삭제
      아하...
      진작 그렇게 설명해야지...
      이번주는 어디 출사 안가? 연휴인데...

  • switch문의 비밀(?)
    2006/06/27 20:15

    IF/ELSE를 쓸까 switch를 쓸까 고민했던적도 있었고...
    switch문을 쓸때 왜 상수밖에 안될까? 아래와 같이 문자(열)도 사용할수 있으면 좋을텐데라고 생각해본적도 있었고...

    string szRet = "success";
    swith(szRet)
    {
      case "success":
      ...
      break;
    }

    아래와 같은 if/else 구조는 O(n)의 복잡도가 된다.

    if(조건)
    {
    ...
    }
    elseif(조건)
    {
    ...
    }
    elseif(조건)
    {
    ...
    }
    n개의 if/else 반복...

    마찬가지로 switch 문을 사용해보자.

    switch(staus)
    {
    case 1:
    ...
    break;
    case 2:
    ...
    break;
    case 3:
    ...
    break;
    ...  n개의 case 문
    }

    우리는 마찬가지로 O(n)의 복잡도를 가질거라고 상상하지만...
    컴파일된 어셈블코드를 보면 이야기는 달라진다.
    물론 case문이 3개 이하거나 case와 case 사이의 차이가 현격히 차이가 날경우 if/else 구조와 같이 비교/점프 코드를 생성한다.
    그외의 경우는 jump table을 생성하고 switch 에 입력된 상수로 jump table에서 jump address를 얻어 바로 점프하는 O(1)의 복잡도를 갖는다.

    바로 여기서 처음에 가졌던 의문, 두가지가 동시에 해결된다.
    즉, 결론을 말하자면...
    효율성을 따져 4개 이상의 if/else를 사용하게 된다면 switch문을 사용한다.
    (case 0; case 1: 과 같이 가급적이 연속적, 순차적으로 사용하는게 좋겠다.)

    만약 switch에서 문자열이 사용가능했더라면 어땠을까? 편리하기는 했어도 일일히 비교하고 분기하는데 힘(?)을 너무 써버려 배보다 배꼽이 더 커진 결과를 초래했을것이다.

    O 표기법
    알고리즘의 효율을 나타낼때 쓰는 표기법으로 얼마나 복잡한가를 나타낸다.
    알고리즘의 연산차수가 여러개 있다면 가장 복잡한(차수가 높은) 항목으로 나타낸다.
    즉 N^2+*2*N+N 과 같은 식에서 N^2를 선택해 O(n^2)와 같이 표기한다.

    참고사이트
    미돌이님 O표기법
    위키백과의 대문자 O 표기법
    이창연님 블러그
    데브피아의 switch에 관한 게시물

    코드와 디스어셈블

    more..

    이올린에 북마크하기(0) 이올린에 추천하기(0)
    2006/06/27 20:15 2006/06/27 20:15
    Trackback Address :: http://hongyver.pe.kr/ttblog/trackback/570

  • 제수리 2006/06/28 20:20  댓글주소  수정/삭제  댓글쓰기
    음.....쉽다...
    IT인간에게 이쯤은...ㅋ

  • Header file 에 관해서...
    2006/06/21 22:30
    #include <stdio.h> 와 #include "stdio.h" 의 차이점은?
    #include <string.h>와 #include <string> 의 차이점은?
    #include <string.h>와 #include <cstring> 또는 <string>의 차이점은?

    누가 이렇게 물어보면 답해줄수 있어?

    #include "..."와 #include <...>의 별 차이는 없다.
    주로 개발자 본인 만든 header 파일의 경우 "..."로 표기하고 표준 헤더 파일일 경우 <...>와 같이 표기한다.
    컴파일러는 "..." 와 같은 헤더는 현재 폴더(작업중인 폴더)에서 찾고 없으면 표준 헤더 파일이 저장되어 있는 곳에서 찾는다. 하지만 <...>로 되어 있으면 포준 헤더 파일이 저장되어 있는 곳에서만 찾는다.
    보다 자세한 내용보기

    예전 C와 C++에서는 #include <iostream.h>와 같이 사용했으나...
    같이 사용하는 혼란에서 벗어나고자(?)...
    C++에서는 아래와 같이 사용하기로 표준으로 정했다...
    #include <iostream>
    using namespace std;

    로 변경해서 사용한다.

    마지막으로 header 파일이 C에서 C++로 넘어오면서 바뀐부분이 있다면 #include <math.h>#include <cmath>와 같이 사용한다.

    보너스로...
    C++에서 main은...void main()과 같이 선언할수가 없다.
    main()
    {
    ...
    }

    마지막 부분에 return 0; 가 없어도 생략 된걸로 표준안이 정해졌기 때문이다...

    C++ 기초 책을 사면 맨~ 앞장에 나온 이야기들...
    아니 이걸 모르고...
    어떻게 프로그래머라고 그래?
    응? 반성하라고...버럭버럭...

    날...찔리지?
    이올린에 북마크하기(0) 이올린에 추천하기(0)
    2006/06/21 22:30 2006/06/21 22:30
    Trackback Address :: http://hongyver.pe.kr/ttblog/trackback/568

  • TWEETY 2006/06/22 00:25  댓글주소  수정/삭제  댓글쓰기
    날...찔리지?? ???? -_-?
  • 제수리 2006/06/22 05:50  댓글주소  수정/삭제  댓글쓰기
    몹니까 이건...모르는말이 많이 나와서 홈피 에러난줄알았슴..ㅡㅡ^

  • warning C4996: deprecated...
    2006/06/21 02:48
    난데없는...warning...
    분명 Visual Studio C++ 6 에서는 잘되던게...
    .\autocopyDlg.cpp(221) : warning C4996: 'wcscpy'이(가) deprecated로 선언되었습니다.
    1>        C:\Program Files\Microsoft Visual Studio 8\VC\include\string.h(250) : 'wcscpy' 선언을 참조하십시오.
    1>        메시지: 'This function or variable may be unsafe. Consider using wcscpy_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.'

    아주 당황스럽다...
    물론 wcscpy_s 로 바꾸던가 #define _CRT_SECURE_NO_DEPRECATE 1 로 define 하거나  #pragma warning(disable:4996) 하면 안볼수도 있지만...웬지 찝찝...
    일부 VisualStudio에서 #define _CRT... 로 해도 warning을 볼수 있는데 직접 프로젝트 속성(ALT+F7)에 /D "_CRT_SECURE_NO_DEPRECATE"를 직접 입력하면 된다...제길...
    ...
    wcscpy(temp,szPath);
    ...

    이 구문인데...temp와 szPath 모두 TCHAR에 같은 배열크기로 지정되었음에도 불구하고...
    도대체 왜? 아래는 MSDN에서 오류메세지에 대해 설명했다...
    오류메세지
    'function'이(가) deprecated로 선언되었습니다.
    'function': was declared deprecated
    컴파일러에서 deprecated로 표시하지 않은 함수를 발견했습니다. 이 함수는 이후 릴리스에서 제공되지 않을 수 있습니다. 다음 예제와 같이 warning pragma를 사용하여 이 경고를 해제할 수 있습니다.
    C4996은 함수를 선언한 줄과 사용한 줄에서 발생합니다.
    <hash_map> 및 <hash_set> 헤더 파일의 멤버를 std 네임스페이스에 사용하면 이 경고가 발생합니다. 자세한 내용은 stdext 네임스페이스를 참조하십시오.
    일부 CRT 함수는 보안이 강화된 새 함수로 대체되어 더 이상 사용되지 않습니다. 더 이상 사용되지 않는 CRT 함수에 대한 자세한 내용은 Security Enhancements in the CRT를 참조하십시오.
    보안상의 이유로 더 이상 사용되지 않는 MFC나 ATL 함수를 사용하는 경우에도 C4996이 발생할 수 있습니다. 이러한 경고가 발생하지 않게 하려면 _AFX_SECURE_NO_DEPRECATE_ATL_SECURE_NO_DEPRECATE를 참조하십시오.


    처음엔 언듯...이해가 안되더라니...번역이라고 해놓은게...
    프로그래머가 해놓은 번역이 아닌건 확실해....ㅜㅜ
    deprecate의 사전전 의미...네이버에서 발췌


    결론은 보안상 또는 Upgrade로 인해 다음 버전에서는 지원을 안할수 있으니 조심하라는 의미...
    제길...
    이올린에 북마크하기(0) 이올린에 추천하기(0)
    2006/06/21 02:48 2006/06/21 02:48
    Trackback Address :: http://hongyver.pe.kr/ttblog/trackback/566

    1. Subject: #prama 로 deprecated 에러:4996 무시해버리기.

      Tracked from 지나간 삶 2007/04/07 21:33  삭제

      http://www.winapi.co.kr에 문법에 관한 설명은 어느 정도 되어 있다.oncepackwarning#pragma warning (disable:4996) //2005의 deprecated에러를 무시한다.를 추가한다면 에러자체를 띠우지 않을 수 있다. stdio.h 헤더파..

  • TWEETY 2006/06/21 19:41  댓글주소  수정/삭제  댓글쓰기
    호오~ 유용해..