728x90
반응형
728x90
반응형
728x90
반응형

C++ 상수 포인터

  • C++에서 const char *pci;와 같은 상수 포인터의 사용은 l-value 처리 시 문제가 발생할 수 있으므로 지양해야 합니다.

  • 또한, C++에서는 const 함수 내에서 멤버 변수를 수정하기 위해 mutable 예약어를 제공합니다.

C++ Gotchas https://www.amazon.com/Gotchas-Avoiding-Common-Problems-Coding/dp/0321125185



아래는 상수 포인터와 mutable 예약어의 사용을 설명하는 간단한 예제 코드입니다.

1. 상수 포인터 예제

  • cpp

    #include <iostream>
    
    int main() {
        const char *pci = "Hello, World!"; // 포인터가 가리키는 값은 변경 불가
        pci = "New String";               // 포인터 자체는 다른 주소로 변경 가능
        std::cout << pci << std::endl;
    
        char buffer[] = "Hello!";
        char *const cp = buffer;          // 포인터 자체는 고정되지만 값은 변경 가능
        cp[0] = 'h';                      // 값 변경 가능
        std::cout << cp << std::endl;
    
        return 0;
    }
    

2. mutable 예약어 예제

  • cpp

    #include <iostream>
    #include <string>
    
    class Example {
    private:
        std::string data;
        mutable int accessCount; // const 함수에서도 수정 가능
    
    public:
        Example(std::string str) : data(str), accessCount(0) {}
    
        void display() const {
            ++accessCount; // mutable을 사용해 const 함수에서 수정 가능
            std::cout << "Data: " << data << ", Accessed: " << accessCount << " times\n";
        }
    };
    
    int main() {
        Example ex("Hello Mutable!");
        ex.display();
        ex.display();
    
        return 0;
    }
    

출력값

  • Output

    New String
    hello!
    Data: Hello Mutable!, Accessed: 1 times
    Data: Hello Mutable!, Accessed: 2 times
    

  • 이 예제는 constmutable의 주요 개념을 보여줍니다.

  • mutableconst 함수에서 객체의 특정 멤버 변수에 한해 값을 변경할 수 있도록 합니다.

728x90
반응형
728x90
반응형

최대한 잘라먹기(Maximal Munch)

  • 최대한 잘라먹기(Maximal Munch) 는 컴파일러가 코드를 파싱할 때 가장 긴 토큰을 우선적으로 인식하는 방식입니다.
  • 이는 형태소 분석(lexical analysis) 과정에서 애매모호한 구문을 어떻게 처리할지를 결정하는 중요한 원칙입니다.

1. Maximal Munch의 개념

  • 컴파일러는 소스 코드를 읽고 토큰(Token) 으로 나누어 의미를 분석합니다.
  • 이 과정에서 컴파일러는 가능한 가장 긴 문자열을 하나의 토큰으로 인식하려고 합니다.

예제 1: p->*mp

  • 소스 출처 : C++ gotchas! 및 Internet

  • cpp

  •  +++++p->*mp
    
  • 위의 코드에서 ->* 는 두 가지로 해석될 수 있습니다.

      1. ->* 두 개의 연산자로 분리
      1. ->* 하나의 연산자로 처리
  • 이처럼 해석이 달라질 수 있는 부분이 Maximal Munch에서 발생하는 대표적인 문제입니다.


2. STL 코드에서의 문제

  • cpp

  •  list<vector<string>> loves;
    
  • 이 코드도 해석이 애매할 수 있습니다.

  • 컴파일러는 >>이동 연산자(Shift Operator) 로 잘못 해석할 가능성이 있습니다.

해결 방법

  • cpp

  •  list< vector<string> > loves;
    
  • 위와 같이 공백을 추가하면 명확하게 해석됩니다.


3. 컴파일러마다 다른 처리 방식

컴파일러별 결과 차이

  • 같은 코드라도 컴파일러와 버전에 따라 다르게 처리됩니다.

    • Visual C++ 2005 → 컴파일 성공
    • GCC 3.4.2 → 컴파일 오류 발생
    • MINGW/GCC>> 대신 > > 필요함 (컴파일 오류)
    • C99 컴파일러>> 로 인한 오류 발생
    • g++ 4.8, g++ 7.3 → 컴파일 성공
  • 이처럼 최신 컴파일러에서는 과거의 오류를 자동으로 해결하는 경우도 있습니다.



4. 코딩 스타일과 언어별 차이

  • 언어마다 구문 처리 방식이 다르므로, 같은 코드를 작성하더라도 해석이 달라질 수 있습니다.

  • Python

    • 공백과 들여쓰기(Tab, Space)가 문법적으로 중요함.
  • Java

    • 공백이 비교적 자유로우며, 들여쓰기와 관계없이 코드가 동작함.
  • C++에서는 공백이 큰 영향을 미치지는 않지만, 위와 같은 >> 문제처럼 특정 문맥에서는 주의가 필요합니다.



5. 정리

  • Maximal Munch는 컴파일러의 토큰 인식 원칙 중 하나로, 애매한 구문을 어떻게 해석할지를 결정하는 역할을 합니다.
  • 컴파일러마다 해석이 다를 수 있으며, 최신 버전에서는 해결될 수도 있습니다.
  • 구형 컴파일러가 오류를 발생시키는 것이 꼭 잘못된 것은 아닙니다. 애매모호한 코드는 문제를 일으킬 가능성이 있기 때문입니다.
  • 표준을 준용하되, 현실적으로 다양한 컴파일러의 동작을 고려해야 합니다.
728x90
반응형

'C C++' 카테고리의 다른 글

현재 윈도우즈 버전 얻기 예제  (0) 2007.05.19
C++ 상수 포인터  (0) 2007.05.17
TTOF2() 함수  (0) 2007.05.09
CMainFrame IDR_MAINFRAME 확장자 연결 문자열  (0) 2007.04.26
GetProcAddress 과 Unicode  (0) 2007.04.14
728x90
반응형

TTOF2() 함수


  • Visual C++ 6.0 에서는 double atof(const char *str) 함수만 지원하며, double _wtof(const wchar_t *str) 함수는 제공되지 않습니다.
  • 참고로, 정수형(generic-text 타입)은 지원되지만, 뭔가 5% 부족한 느낌이 있습니다.

그래서 직접 함수를 만들어 보았습니다.

  • atof() 대신 사용할 수 있도록 VC++ 6.0에서 TCHAR을 지원하는 형식으로 개선 한 함수입니다.
  • 만약 VC++ 6.0을 어쩔 수 없이 사용해야 한다면 한 번 활용해 보세요!


  • cpp

    
    ////////////////////////////////////////////////////////////////////////// 
    //
    // TTOF2.h
    //
    //  made by j2doll (https://j2doll.tistory.com/102) 
    //  v0.2 : check valiation of input parameter
    //  v0.1 : Initial version ( 9, May, 2007 )
    //  use for visual c++ 6.0 or under version  
    // 
    //////////////////////////////////////////////////////////////////////////
    
    #ifndef _TTOF2_DEFINE
    #define _TTOF2_DEFINE
    
    #if _MFC_VER >= 0x0700
    
    #ifdef _UNICODE
    static double TTOF2(WCHAR *szIn) { return ( _wtof(szIn) ); }; 
    #else
    static double TTOF2(CHAR *szIn) { return ( atof(szIn) ); } 
    #endif 
    
    #else // 6 or under version 
    
    #ifdef _UNICODE
    static double TTOF2(WCHAR *szIn)
    {
    
      if ( szIn == NULL ) 
    
        return 0;
    
      double retVal;
      size_t len = _tcslen( szIn );
    
      if ( len == 0 )
    
        return 0; 
    
      CHAR  * szMBCSBuf = new CHAR [ len + 1 ];
      ASSERT(NULL!=szMBCSBuf); // DEBUG 
    
      WideCharToMultiByte( CP_ACP, 0, szIn, (-1), szMBCSBuf, sizeof(szMBCSBuf), NULL, NULL ); // convert character-set
      retVal = atof( szMBCSBuf ); 
    
      delete [] szMBCSBuf; 
    
      return retVal;
    }
    #else
     static double TTOF2(CHAR *szIn) { return ( atof(szIn) ); } 
    #endif //  _UNICODE
    
    #endif // _MFC_VER >= 0x0700 
    
    #endif // _TTOF2_DEFINE 
    
    //----------------------------------------------------------
    
    
728x90
반응형
728x90
반응형

MFC SDI/MDI 프로그램 확장자 연결

MFC SDI/MDI 프로그램에서 특정 확장자(예: .myc)를 연결하려면,

리소스 편집기에서 IDR_MAINFRAME 항목을 다음과 같이 수정합니다:

MyCalc Windows Application\nSheet\nWorksheet\nWorksheets (*.myc)\n.myc\nMyCalcSheet\nMyCalc Worksheet

이 설정을 통해 .myc 확장자를 프로그램과 연동할 수 있습니다.

해당 리소스는 CMainFrame 클래스가 사용합니다.

728x90
반응형

'C C++' 카테고리의 다른 글

C++ 상수 포인터  (0) 2007.05.17
최대한 잘라먹기(Maximal Munch)와 컴파일러(Compiler)  (2) 2007.05.16
TTOF2() 함수  (0) 2007.05.09
GetProcAddress 과 Unicode  (0) 2007.04.14
.NET 프레임워크 인식하기  (0) 2007.04.07
728x90
반응형

GetProcAddressUnicode

  • GetProcAddress 함수는 동적 라이브러리(DLL)에서 함수를 동적으로 가져올 때 사용됩니다.
  • 이 함수의 두 번째 매개변수인 lpProcNameLPCSTR 타입으로 정의되어 있으며, 이는 C 스타일의 문자열(char 포인터)을 의미합니다.
  • 즉, 함수 이름은 항상 멀티바이트 문자열로 처리되며, 유니코드 문자열을 직접 사용할 수 없습니다.

  • 따라서 유니코드 설정에서 함수 이름을 지정할 때도 멀티바이트 문자열을 사용해야 합니다. 예를 들어, 유니코드 설정에서 다음과 같이 작성하면:

cpp

... = (...) GetProcAddress(hMod, _T("Hello"));

  • 이 코드는 컴파일되지 않습니다.
  • _T("Hello")는 유니코드 문자열이므로, GetProcAddress는 이를 인식하지 못합니다.
  • 올바르게 사용하려면 다음과 같이 수정해야 합니다:

cpp

... = (...) GetProcAddress(hMod, "Hello");

  • 이처럼 함수 이름은 영문자, 숫자, 일부 특수문자로만 구성되어야 하며, 유니코드 문자를 포함할 수 없습니다.
  • 이는 Windows API의 설계 원칙에 따른 것으로, 함수 이름은 국제화되지 않고 영어(English) 를 기반으로 합니다.

  • 요약하면, GetProcAddress를 사용할 때는 항상 멀티바이트 문자열로 함수 이름을 지정해야 하며, 유니코드 문자열을 사용할 수 없습니다.
728x90
반응형

'C C++' 카테고리의 다른 글

C++ 상수 포인터  (0) 2007.05.17
최대한 잘라먹기(Maximal Munch)와 컴파일러(Compiler)  (2) 2007.05.16
TTOF2() 함수  (0) 2007.05.09
CMainFrame IDR_MAINFRAME 확장자 연결 문자열  (0) 2007.04.26
.NET 프레임워크 인식하기  (0) 2007.04.07
728x90
반응형

.NET 프레임워크 인식하기

이 글은 C++로 작성된 CDetectDotNet 클래스를 소개하며, 이를 통해 시스템에 설치된 .NET 프레임워크의 존재 여부와 버전을 확인하는 방법을 설명합니다.

주요 기능:

  • .NET 프레임워크 존재 확인: IsDotNetPresent() 메서드를 사용하여 시스템에 .NET 프레임워크가 설치되어 있는지 확인합니다.

  • 설치 경로 확인: GetInstallRootPath() 메서드를 통해 .NET 프레임워크의 설치 루트 경로를 얻을 수 있습니다.

  • CLR 버전 열거: EnumerateCLRVersions() 메서드를 사용하여 시스템에 설치된 CLR(Common Language Runtime) 버전들을 열거할 수 있습니다.

사용 예시:

cpp

#include "DetectDotNet.h"

CDetectDotNet detect;
vector<string> CLRVersions;

cout << "Is .NET present: " << (detect.IsDotNetPresent() ? "Yes" : "No") << endl;

TCHAR szPath[300];
cout << "Root Path: " << (detect.GetInstallRootPath(szPath, 299) ? szPath : "") << endl;

cout << "Number of CLRs detected: " << (int)detect.EnumerateCLRVersions(CLRVersions) << endl;
cout << "CLR versions available:" << endl;
for (const auto& version : CLRVersions) {
    cout << version << endl;
}

구현 원리:

  • .NET 프레임워크 존재 확인: mscoree.dllLoadLibrary로 로드하고, GetProcAddress를 통해 GetCORVersion 함수의 존재 여부를 확인하여 .NET 프레임워크의 설치 여부를 판단합니다.

  • CLR 버전 열거: 레지스트리에서 .NET 프레임워크의 설치 루트 경로를 얻은 후, 해당 경로 내의 하위 디렉토리를 탐색하여 설치된 CLR 버전들을 확인합니다.

이 클래스는 설치 프로그램 등에서 시스템의 .NET 프레임워크 설치 상태를 확인하는 데 유용하게 활용될 수 있습니다.

728x90
반응형

'C C++' 카테고리의 다른 글

C++ 상수 포인터  (0) 2007.05.17
최대한 잘라먹기(Maximal Munch)와 컴파일러(Compiler)  (2) 2007.05.16
TTOF2() 함수  (0) 2007.05.09
CMainFrame IDR_MAINFRAME 확장자 연결 문자열  (0) 2007.04.26
GetProcAddress 과 Unicode  (0) 2007.04.14

+ Recent posts