__stdcall

  • stdcall은 Microsoft에서 사용하는 호출 규약 중 하나로, 주로 Win32 API 함수 호출에 사용됩니다. 호출 규약은 함수가 호출될 때 스택을 정리하는 책임이 호출된 함수(callee)에 있다는 점에서 다른 호출 규약과 차별화됩니다.

주요 특징

  • 인수 전달 순서: 오른쪽에서 왼쪽으로 전달됩니다.

    • 우측에 인수부터 스택에 쌓임
  • 인수 전달 방식: 값으로 전달되며, 포인터나 참조 타입이 전달될 경우 해당 타입으로 전달됩니다.

  • 스택 유지 관리: 호출된 함수가 스택을 정리합니다.

  • 이름 장식 규칙: 함수 이름 앞에 밑줄(_)이 붙고, 이름 뒤에 @ 기호와 인수 목록의 바이트 수가 붙습니다. 예를 들어, int func(int a, double b) 함수는 _func@12로 장식됩니다.

  • 대소문자 변환 규칙: 없음.

주된 사용 사례

  1. Win32 API 함수 호출: 많은 Win32 API 함수가 stdcall을 사용합니다.

  2. COM 인터페이스: Component Object Model(COM)에서는 stdcall을 사용하여 인터페이스 메서드를 호출합니다.

  3. DLL 함수: 동적 링크 라이브러리(DLL)에서 정의된 함수를 호출할 때 stdcall을 사용합니다.

'프레임워크 > VisualStudio' 카테고리의 다른 글

디버깅 팁  (1) 2025.03.27
MSVC_CL 명령  (0) 2025.03.27
XML 문서화  (0) 2025.03.27
SAL 주석(Static Analysis Language)  (0) 2025.03.27
단축키  (0) 2025.03.27

C#

  • 자체 내장 기능으로 XML 주석 문서화 기능을 제공

C++

  • 자체 기능으로 제공 x
  • VS에서 XML 주석 IntelliSense 는 제공
  • Doxygen 주석 XML 문서화 를 사용한 문서화 추천

Doxygen 태그

태그 설명
@brief 간단한 설명을 작성합니다.
@details 보다 자세한 설명을 작성할 때 사용합니다.
@param 함수 매개변수를 설명합니다.
@return 함수의 반환값에 대해 설명합니다.
@exception 함수가 발생시킬 수 있는 예외에 대해 설명합니다.
@throws @exception과 동일. 예외를 설명합니다.
@see 관련된 항목을 참조하도록 링크를 제공합니다.
@note 추가적으로 주의해야 할 점이나 정보를 강조합니다.
@warning 사용자에게 중요한 경고를 제공합니다.
@todo 해야 할 작업이나 보완점을 표시합니다.
@file 파일에 대한 정보를 설명합니다.
@author 작성자를 명시합니다.
@version 파일의 버전을 명시합니다.
@date 작성 날짜를 명시합니다.
@deprecated 더 이상 사용되지 않는 함수나 기능임을 표시합니다.
@code 코드 예제를 작성할 때 사용합니다.
@endcode 코드 블록의 끝을 나타냅니다.
@example 예제 파일에 대한 정보를 작성합니다.
```cpp
/**
* @file MyProgram.cpp
* @brief 이 파일은 간단한 프로그램의 메인 기능을 제공합니다.
* @author John Doe
* @date 2025-03-05
* @version 1.0
*/

/**

  • @brief 두 숫자의 합을 계산합니다.
  • @param a 첫 번째 숫자
  • @param b 두 번째 숫자
  • @return 두 숫자의 합
  • @note 입력 값은 정수여야 합니다.
  • @warning 값이 너무 크면 오버플로우가 발생할 수 있습니다.
  • /
    int Add(int a, int b) {
    return a + b;
    }
    
    

XML 주석 태그

태그 설명
<summary> 클래스, 메서드, 속성, 필드 등에 대한 간단한 요약을 제공합니다.
<param> 메서드의 매개변수를 설명합니다.
<returns> 함수나 메서드의 반환 값을 설명합니다.
<remarks> 추가적인 참고 정보나 부가 설명을 제공합니다.
<example> 코드 예제를 제공합니다. 예제는 <code> 태그와 함께 사용됩니다.
<exception> 메서드가 발생시킬 수 있는 예외를 설명합니다.
<see> 다른 클래스, 메서드, 속성 등을 참조하도록 링크를 제공합니다.
<seealso> 관련 항목에 대한 참조를 제공합니다.
<value> 속성의 값을 설명합니다.
<inheritdoc> 상위 클래스나 인터페이스로부터 주석을 상속받습니다.
<typeparam> 제네릭 메서드 또는 클래스의 형식 매개변수를 설명합니다.
```cs
///
/// 주어진 두 숫자의 합을 계산합니다.
///
/// 첫 번째 숫자
/// 두 번째 숫자
/// 두 숫자의 합
///
/// 입력 값이 너무 큰 경우 오버플로우가 발생할 수 있습니다.
///
///
///
/// int result = Add(10, 20);
/// Console.WriteLine(result); // 출력: 30
///
///
/// 값이 너무 커서 오버플로우가 발생할 때 발생합니다.
public int Add(int a, int b)
{
return checked(a + b);
}
```

'프레임워크 > VisualStudio' 카테고리의 다른 글

MSVC_CL 명령  (0) 2025.03.27
__stdcall  (0) 2025.03.27
SAL 주석(Static Analysis Language)  (0) 2025.03.27
단축키  (0) 2025.03.27
MSVC 빌드 관련  (0) 2025.03.27

참고 : Understanding SAL - Visual Studio 2015 | Microsoft Learn

개념

  • MS의 정적 분석 도구와 함께 사용하는 주석 기반 언어
  • 정적 분석을 통해 잠재적인 오류 감지하고 코드 품질 향상에 사용

    주석들

  • _In_ : 입력 매개변수 (읽기 전용)
  • _In_opt_ : 선택적 입력 매개 변수 (NULL 허용)
  • _Out_ : 출력 매개변수 (함수에서 값을 초기화하여 반환)
  • _Inout_ : 입력도 되고 출력도 되는 매개변수 (읽고 쓰고 수정 가능)
  • _Outptr_ : 포인터를 반환하는 출력 매개변수 (동적 할당)
  • _Null_terminated_ : NULL로 종료되는 문자열 (c 스타일 문자열)

'프레임워크 > VisualStudio' 카테고리의 다른 글

MSVC_CL 명령  (0) 2025.03.27
__stdcall  (0) 2025.03.27
XML 문서화  (0) 2025.03.27
단축키  (0) 2025.03.27
MSVC 빌드 관련  (0) 2025.03.27

Ctrl + Alt + O : 출력 창 띄우기
Ctrl + Alt + K : 호출 스택 띄우기

Ctrl + F5 : 디버거 없이 실행하기
OutputDebugString : 사용불가
F5 : 디버그 실행
F5 : 디버그 상태에서 다음 중단점까지 실행
F9 : 디버그 중단점 찍기
Ctrl + Shfit + F9 : 모든 디버그 중단점 제거
F10 : 디버그 상태에서 다음 프로시저 실행
F11 : 디버그 상태에서 코드 1줄 씩 실행

Ctrl + Alt + 커서 : 분할 커서
Ctrl + M + P : 전체 폴딩 열기
Ctrl + M + O : 정의 부분만 보이기

'프레임워크 > VisualStudio' 카테고리의 다른 글

MSVC_CL 명령  (0) 2025.03.27
__stdcall  (0) 2025.03.27
XML 문서화  (0) 2025.03.27
SAL 주석(Static Analysis Language)  (0) 2025.03.27
MSVC 빌드 관련  (0) 2025.03.27

vs2022 build 관련

  • 프로젝트 폴더에 해당 빌드폴더(파일) 생성됨. (솔루션 폴더x)
  • Recipe 파일?

    • 프로젝트의 빌드 및 배포를 자동화하기 위해 사용되는 설정 파일
    • CI/CD 구축에 용이
    • 내부 예시
      <recipe>
      <steps>
        <step name="Build">
            <command>msbuild MyProject.sln /p:Configuration=Debug</command>
        </step>
        <step name="Test">
            <command>vstest.console.exe MyProjectTests.dll</command>
        </step>
        <step name="Package">
            <command>dotnet publish MyProject.csproj -c Release -o ./publish</command>
        </step>
        <step name="Deploy">
            <command>powershell.exe -File DeployScript.ps1</command>
        </step>
      </steps>
      </recipe>
      

```

- 해당 파일을 참고하여 GithubAction 용파일 작성 가능
```yml
name: CI

on:
  push:
    branches:
      - main
  pull_request:
    branches:
      - main

jobs:
  build:
    runs-on: windows-latest

    steps:
    - name: Checkout repository
      uses: actions/checkout@v2

    - name: Set up MSBuild
      uses: microsoft/setup-msbuild@v1

    - name: Build solution
      run: msbuild MyProject.sln /p:Configuration=Debug

    - name: Run tests
      run: vstest.console.exe MyProjectTests.dll

    - name: Publish
      run: dotnet publish MyProject.csproj -c Release -o ./publish

    - name: Deploy
      run: powershell.exe -File DeployScript.ps1

```
  • .ilk?

    • Linker에 의해 생성되는 파일
    • 링킹 과정에서 필요한 정보를 저장. (Library, Dependancy, etc...)
  • .log || .tlog

    • 빌드 및 링크 과정에서 발생한 상세 로그

'프레임워크 > VisualStudio' 카테고리의 다른 글

MSVC_CL 명령  (0) 2025.03.27
__stdcall  (0) 2025.03.27
XML 문서화  (0) 2025.03.27
SAL 주석(Static Analysis Language)  (0) 2025.03.27
단축키  (0) 2025.03.27

참조 : "전문가를 위한 C++ 개정 5판"

유용한 매니퓰레이터

  • <ios> 또는 <iomanip> 표준 헤더에 정의
  • 유용하게 쓰이는 것들
    • boolalpha, noboolalpha : 스트림에 bool 값을 true, false로 출력
    • hex, oct, dec : 숫자를 각 해당 진수로 표현
    • setprecision : 분숫값을 표현할 때, 사용할 소수점 자릿수 지정; 인수 받음
    • setw : 데이터 출력할 필드 너비 지정; 인수 받음; 다음 출력에만 적용
    • setfill : 지정 너비보다 작을 때, 빈 공간 채울 문자 지정; 인수 받음
    • showpoint, noshowpoint : 부동 소수점에서 소수점 부분 없을 떄, 소수점 표현할 지 지정;

입력 에러처리

  • 표준 입력 에러처리 방식 예시

      if (!cin.good())
      {
          cerr << "Standard input is in a bad state!" << endl;
      }
      int sum { 0 };
      while (!cin.bad())
      {
          int number;
          cin >> number;
          if (cin.good())
          {
              sum += number;
          }
          else if (cin.eof())
          {
              break; // 파일의 끝 도달
          }
          else if (cin.fail())
          {
              cin.clear() // 에러상태 제거
              string badToken;
              cin >> badToken;
              cerr << "WARNING: Bad Input encounterd: " << badToken << endl;
          }
      }
    
      cout << "The Sum is " << sum << endl;
      /*
      1
      2
      test
      WARNING: Bad Input encounterd: test
      3
      The Sum is 6
      */
  • 이름 입력 받기 예시

      string readName(istream& stream)
      {
          string name;
          char next;
          while(stream.get(next))
          {
              name += next;
          }
          return name;
      }

그 외 도움되는 메서드

  • unget() :
    • 한 칸 앞으로 거슬로 올라가기
    • 성공 여부는 fail() 메서드로 확인
  • putback() :
    • 매개 인자를 버퍼로 되돌리고 다시 읽을 수 있게 됨
  • peek() :
    • 다음 문자를 미리 읽기
  • getline() :
    • 한 줄 크기만큼 읽음
    • buffersize - 1 만큼 읽거나 EOL 문자가 나올 때까지 읽기 연산 수행 (EOL문자도 버퍼 크기 포함)

파일 스트림

상수 설명
ios_base::app 파일을열고, 쓰기 연산을 수행하기 전에 파일 끝으로 간다
ios_base::ate 파일을 열고, 즉시 파일 끝으로 간다
ios_base::binary 입력 또는 출력을 텍스트가 아닌 바이너리 모드로 처리
ios_base::in 입력 파일을 열고 시작 지점부터 읽음
ios_base::out 출력 파일을 열고 시작 지점부터 쓴다. 기존 데이터 덮어쓰기
ios_base::trunc 출력 파일 열고 기존 데이터 모두 삭제(truncate)
ios_base::beg 스트림의 시작점
ios_base::end 스트림의 끝점
ios_base::cur 스트림의 현재 위치

파일 입출력 스트림

  • 파일의 끝에 도달했는지는 stream.eof() 로 확인가능

  • 실패는 stream.fail() 로 확인

  • <fstream> 사용

    • ifstream : 입력 파일 스트림; 파일 읽기
    • ofstream : 출력 파일 스트림; 파일 쓰기
  • <iostream> 사용

    • fstream : 양방향 스트림; 파일 읽기/쓰기

      • 파일 안에서 데이터 교체에 용이
    • 사용 예제

        bool changeNumberForID(string_view filename, int id, string_view newNumber)
        {
            fstream ioData { filename.data() };
            if (!ioData)
            {
                cerr << "Error while opening file " << filename << endl;
                return false;
            }
      
            // 파일 끝까지 반복
            while (ioData) 
            {
                int idRead;
                ioData >> idRead;
      
                if (!ioData)
                {
                    break;
                }
      
                // 현재 레코드가 수정 대상인지 확인
                if (idRead == id)
                {
                    // 쓰기 위치를 현재 읽기 위치로 이동
                    ioData.seekp(ioData.tellg());
                    // 한 칸 띄운 뒤 새 번호 쓰기
                    ioData << " " << newNumber;
                    break;
                }
                // 현재 위치에서 숫자를 읽어서 스트림의 위치를 다음 레코드로 이동
                string number;
                ioData >> number;
            }
            return true;
        }

'공부 > C++' 카테고리의 다른 글

예외처리(simple)  (0) 2025.04.09
Attribute  (0) 2025.03.27
C++스트림  (0) 2025.03.26
decltype  (0) 2025.03.26
추상 클래스  (0) 2025.03.15

참조 : "전문가를 위한 C++ 개정 5판"

유용한 매니퓰레이터

  • <ios> 또는 <iomanip> 표준 헤더에 정의
  • 유용하게 쓰이는 것들
    • boolalpha, noboolalpha : 스트림에 bool 값을 true, false로 출력
    • hex, oct, dec : 숫자를 각 해당 진수로 표현
    • setprecision : 분숫값을 표현할 때, 사용할 소수점 자릿수 지정; 인수 받음
    • setw : 데이터 출력할 필드 너비 지정; 인수 받음; 다음 출력에만 적용
    • setfill : 지정 너비보다 작을 때, 빈 공간 채울 문자 지정; 인수 받음
    • showpoint, noshowpoint : 부동 소수점에서 소수점 부분 없을 떄, 소수점 표현할 지 지정;

입력 에러처리

  • 표준 입력 에러처리 방식 예시

      if (!cin.good())
      {
          cerr << "Standard input is in a bad state!" << endl;
      }
      int sum { 0 };
      while (!cin.bad())
      {
          int number;
          cin >> number;
          if (cin.good())
          {
              sum += number;
          }
          else if (cin.eof())
          {
              break; // 파일의 끝 도달
          }
          else if (cin.fail())
          {
              cin.clear() // 에러상태 제거
              string badToken;
              cin >> badToken;
              cerr << "WARNING: Bad Input encounterd: " << badToken << endl;
          }
      }
    
      cout << "The Sum is " << sum << endl;
      /*
      1
      2
      test
      WARNING: Bad Input encounterd: test
      3
      The Sum is 6
      */
  • 이름 입력 받기 예시

      string readName(istream& stream)
      {
          string name;
          char next;
          while(stream.get(next))
          {
              name += next;
          }
          return name;
      }

'공부 > C++' 카테고리의 다른 글

Attribute  (0) 2025.03.27
C++ IO스트림  (0) 2025.03.27
decltype  (0) 2025.03.26
추상 클래스  (0) 2025.03.15
문자열  (1) 2025.03.14

언리얼 스마트 포인터

  • cpp 스마트 포인터에서 소문자->대문자, 언더바->붙여쓰기 형태가 다를 뿐 생성과 사용 유사

  • use_count()로 확인 대신, GetSharedReferenceCount()로 확인

  • 공유 포인터 예시

      #include "CoreMinimal.h"
    
      class MyClass {
      public:
          MyClass(int val) : Value(val) {}
          int Value;
      };
    
      void Example() {
          // TSharedPtr 사용
          TSharedPtr<MyClass> shared1 = MakeShared<MyClass>(42);
          TSharedPtr<MyClass> shared2 = shared1; // 참조 공유
    
          UE_LOG(LogTemp, Warning, TEXT("shared1 Value: %d"), shared1->Value);
          UE_LOG(LogTemp, Warning, TEXT("shared2 Value: %d"), shared2->Value);
          UE_LOG(LogTemp, Warning, TEXT("Reference count: %d"), shared1.GetSharedReferenceCount()); // 참조 카운터 출력
      }

왜 언리얼 스마트 포인터 사용?

  • 기존 cpp의 스마트 포인터는 멀티스레드에서 성능 저하
    • shared_ptr 내부에서 기본적인 lock 방식을 사용하기에
  • 기존 cpp의 스마트 포인터는 객체의 잦은 소멸과 생성에서 성능 최적화X
  • UE 스마트포인터는 내부의 가비지 컬렉터와 커스텀 메모리 풀 및 스레드 로컬 참조 관리를 통해서 엔진에 맞게 성능이 최적화되어 있음

+ Recent posts

let textNodes = document.querySelectorAll("div.tt_article_useless_p_margin.contents_style > *:not(figure):not(pre)"); textNodes.forEach(function(a) { a.innerHTML = a.innerHTML.replace(/`(.*?)`/g, '$1'); });