728x90

프로젝트 메뉴에서 Covert To C 또는 Convert To C++로 원하는 언어로 전환

convert

프로젝트 설정에서 Disable handling exceptions 체크 해지

exception설정

C++ 컴파일러 설정에서 C++ 표준 선택

표준선택

include path는 GNU C, GNU C++ 모두 추가

INCLUDE PATH

728x90
728x90

 

decltypetypeof의 차이와 활용법

decltypetypeof는 변수 또는 표현식의 타입을 추론하기 위해 사용되는 기능이다. 두 키워드는 모두 타입 추론이라는 공통점을 가지지만, 제공 방식과 활용 방법에서 큰 차이를 보인다. 아래에서 두 키워드의 개념과 사용법, 그리고 주요 차이점을 정리한다.


decltype

개념

decltype은 C++11에서 도입된 키워드로, 변수나 표현식의 타입을 정확히 추론하여 사용할 수 있도록 한다. 이는 특히 템플릿 프로그래밍과 같은 고급 C++ 프로그래밍에서 매우 유용하게 활용된다.

문법

decltype(expression) variable_name;
  • expression: 타입을 추론하고자 하는 변수 또는 표현식.
  • variable_name: 추론된 타입으로 선언될 변수의 이름.

예제

#include <iostream>

int main() {
    int x = 42;
    decltype(x) y = x;  // y의 타입은 int로 추론된다.

    std::cout << "y의 값: " << y << std::endl;  // 출력: y의 값: 42
    return 0;
}

이 코드는 decltype(x)를 사용하여 변수 x의 타입을 추론하고, 이를 변수 y의 타입으로 사용한 예제이다.

주요 특징

  • 정확한 타입 추론: 변수나 표현식의 타입을 그대로 유지하여 추론한다.
  • 템플릿과의 호환성: 템플릿 매개변수의 타입을 추론하거나, 복잡한 표현식의 타입을 명확히 하기 위해 사용된다.
  • 자동화된 코드 작성: 수동으로 타입을 지정하지 않아도 되므로 코드 가독성과 유지보수성이 향상된다.

활용 예제

  1. 템플릿 함수에서의 활용
    template <typename T1, typename T2>
    auto add(T1 a, T2 b) -> decltype(a + b) {
     return a + b;
    }

이 예제에서는 decltype(a + b)를 사용하여 두 매개변수의 덧셈 결과 타입을 추론한다. 이를 통해 함수 반환 타입을 동적으로 결정할 수 있다.

  1. 복잡한 표현식의 타입 추론
    #include <vector>
    

std::vector v;
decltype(v.begin()) it = v.begin(); // 반복자의 타입을 추론한다.


---

### `typeof`

#### 개념  
`typeof`는 GNU C 확장에서 제공되는 키워드로, 변수나 표현식의 타입을 추론한다. 주로 매크로나 타입에 대한 동적 추론이 필요한 경우 사용된다.

#### 문법  
```c
typeof(expression) variable_name;
  • expression: 타입을 추론하고자 하는 표현식.
  • variable_name: 추론된 타입으로 선언할 변수의 이름.

예제

#include <stdio.h>

#define MAX(x, y) ({             \
    typeof(x) _x = (x);          \
    typeof(y) _y = (y);          \
    _x > _y ? _x : _y;           \
})

int main() {
    int a = 5, b = 10;
    typeof(a) max_value = MAX(a, b);

    printf("최댓값: %d\n", max_value);  // 출력: 최댓값: 10
    return 0;
}

이 예제에서는 typeof를 사용하여 매크로 내에서 xy의 타입을 동적으로 추론하고, 이를 통해 타입 안정성을 확보하고 있다.

주요 특징

  • GNU 확장: C 표준의 일부가 아니며, GCC 컴파일러에서만 지원된다.
  • 매크로와의 결합: 매크로 내부에서 타입 추론을 통해 유연한 코드를 작성할 수 있다.
  • 이식성 제한: 비표준 기능이므로, 다른 컴파일러에서는 동작하지 않을 가능성이 있다.

decltypetypeof의 차이점

  1. 표준 여부
    decltype은 C++11 표준에 포함된 기능으로, 다양한 컴파일러에서 지원된다. 반면, typeof는 GNU C 확장 기능으로, GCC 컴파일러에서만 사용할 수 있다.
  2. 적용 언어
    decltype은 C++ 전용 키워드인 반면, typeof는 C와 C++ 모두에서 사용할 수 있다.
  3. 용도 차이
    decltype은 템플릿 프로그래밍과 같은 고급 C++ 기능에서 주로 사용되며, 더 복잡한 타입 추론을 지원한다. typeof는 매크로와 같은 간단한 코드에서 타입을 추론하는 데 적합하다.
  4. 이식성
    decltype은 표준 기능이므로 대부분의 현대 컴파일러에서 동작한다. 반면, typeof는 GNU 확장 기능이기 때문에 비표준 환경에서는 사용이 제한된다.

요약

  • decltype은 C++ 표준의 일부로, 변수나 표현식의 타입을 정확히 추론한다.
  • typeof는 GNU 확장에서 제공되는 기능으로, 매크로와 같은 간단한 코드에서 타입 추론을 돕는다.
  • 이식성과 호환성 측면에서 decltype이 더 유리하며, typeof는 특정 환경에서만 사용할 수 있다.
  • C++ 프로그래밍에서 타입 추론이 필요할 경우, decltype을 사용하는 것이 더 권장된다.
728x90
728x90

extension다운로드

TODO Highlight V1과 V2가 보인다. V2는 아직 안정화되지 않은 것 같다.(2024.11.20일 기준) TODO Highlight v2 설치

설치하고 VSC를 재실행하고 아래와 같이 주석을 작성해보자.

// FIXME:
// TODO:

주석이미지

이렇게 컬러로 표시되고 한눈에 확인하기 쉽다. 블록 주석에 넣어도 동일하게 표현된다.

주석이미지2

주석을 입력할 때마다 FIXME:, TODO:를 입력하기 힘드니 Snippets을 활용해 자동완성기능을 만들어보자.

ctrl+shift+p를 눌러 Preference 창을 열어 검색하거나 File->Preference에 들어가면 Snippets을 configure 할 수 있는 메뉴가 나온다.

스니펫configure스니펫configure2

Configure Snippets를 선택하며 아래와 같이 언어를 선택하는 창이 나온다.

여기서는 C를 선택한다.

스니펫언어선택

// 입력했을 때 제시되는 키워드를 추가해 주자.

키워드추가이미지

"Fixme Comment": {
    "prefix": "// FIXME:",
    "body": [
        "// FIXME: $0"
    ],
    "description": "Add a single line TODO comment"
},

"TODO Comment": {
    "prefix": "// TODO:",
    "body": [
        "// TODO: $0"
    ],
    "description": "Add a single line TODO comment"
}

위와 같이 추가하고 저장한 다음에 .c파일로 돌아와 //를 입력해 보면 아래와 같이 나타난다.

키워드 제안

블록 단위의 주석도 동일한 방법으로 추가해 보자.

"Block FIXME Comment": {
    "prefix": "/* FIXME:",
    "body": [
        "/* FIXME: $0\n * \n */"
    ],
    "description": "Add a Block FIXME comment"
},

"Block TODO Comment": {
    "prefix": "/* TODO:",
    "body": [
        "/* TODO: $0\n * \n */"
    ],
    "description": "Add a Block FIXME comment"
}

/* 여기 까지만 입력하면 아래와 같이 키워드를 제시해 준다.

스니펫키워드제시이미지

 

vsc는 코드를 주석 블록, 함수, 구조체, class 등 단위로 접었다 펴는 코드폴딩(code folding) 기능을 제공하기 때문에 잘 활용한다면 코드 가독성을 높이고 문서화에 많은 도움이 될 것 같다. 

728x90
728x90

가평 숯불 닭갈비 구이 맛집 계화원

아침 고요 수목원에서 멀지 않은 곳에 위치해 있다.

 

입구에 이런 간판이 있이 보이면 들어가면된다.

건물 느낌이 약간 일본식? 같은 느낌이다.

 

 

마당에 강아지가 한마리있는데 사람만 보며 벌러덩 드러눕는다. 귀여운자식

 

조금 독특한 이벤트?를 한다. 지금도 하는지는 모르겠지만

5만원이상 식사하고 영수증을 지참한 다음에 "나무아래오후N" 이라는 카페에가서 15,000원 이상 구매하면 아메리카노1잔을 준다.

같은 방식으로 9만원 이상 식사하고 카페에서 25,000원 이상 구매하면 아메리카노 2잔을 준다.

우리는 인원이 7명이라 식사 금액이 20만원이 넘게 나왔고, 카페에서도 25,000원은 훌쩍넘었기에 아아를 두잔 서비스 받았다 ㅎㅎ

 

카페 위치는 아래 지도참고!

식사하고 카페에 가봤는데 나쁘지 않다 야외 언덕에 테이블? 쇼파같은것들이 엄청나게 많아서 날씨좋을때는 야외에서 커피를 즐기기에 좋다. 

빵도 종류가 많아서 개인적으로 추천한다!

 

메뉴판은 사진을 못찍었는데 닭갈비는 소금, 양념, 간장 이렇게 있고 다양한 셋트메뉴도 있다.

둘이 먹어도 50,000원은 충분히 넘을듯 ?

깔끔한 밑반찬

 

 

닭갈비는 한번 초벌된 상태로 나오기때문에 약 3분정도만 익혀서 먹으면된다.

닭갈비 맛도 괜찮다. 우리는 약 11시쯤 들어갔는데 12시가 다되어가 자리는 꽉 차고 웨이팅이 생기기 시작했다. 

 

 

양념구이로 마무리~~~

 

들깨막국수를 못찍었네... 들깨막국수와 비빔국수도 판다. 이것도 맛있다.

 

재방문 의사 100%

 

728x90
728x90

vsc에서 c/c++빌드를하기위해 CMake Quick Start를 선택해 프로젝트를 만드는 과정에서 CPackCTest를 선택하는 과정이나온다.

2024.08.02 - [개발 관련 지식 및 Tool 사용방법/Visual studio code(VSC, VSCode)] - vsc에서 Cmake 개발환경 구축하기

[vsc에서 Cmake 개발환경 구축하기

이전에 반드시 컴파일러가 설치되어 있어야하고, 시스템 환경 변수에 컴파일러 경로가 추가되어 있어야 한다. 컴파일러 설치는 아래 포스팅 참고2024.09.16 - [개발 관련 지식 및 Tool 사용방법] - gcc

vuzwa.tistory.com](https://vuzwa.tistory.com/entry/vsc%EC%97%90%EC%84%9C-Cmake-%EA%B0%9C%EB%B0%9C%ED%99%98%EA%B2%BD-%EA%B5%AC%EC%B6%95%ED%95%98%EA%B8%B0)

이번 포스팅에서는 CTest에 대해 알아보자.

CTest는 CMake와 함께 제공되는 테스트 도구로, 빌드된 프로그램의 테스트를 자동화하고 관리할 수 있게 해준다. 이를 통해 유닛 테스트, 통합 테스트 등을 쉽게 실행할 수 있다.

CTest 설정 단계

  1. 테스트 사용 설정: CMakeLists.txt 파일에 enable_testing() 명령어를 추가해 테스트를 활성화한다.
  2. 테스트 추가: add_test() 명령어를 사용해 테스트 실행 파일과 명령어를 등록한다.
  3. CTest 명령어 실행: CMake로 프로젝트를 빌드한 후 ctest 명령어를 사용해 테스트를 수행한다.

예제: CMakeLists.txt 파일 설정

cmake_minimum_required(VERSION 3.10)
project(MyProject)

# 소스 파일 추가
add_executable(MyExecutable main.cpp)

# CTest 사용 설정
enable_testing()

# 테스트 추가 (예: MyExecutable을 테스트로 사용)
add_test(NAME MyTest COMMAND MyExecutable)

enable_testing()add_test() 명령어를 통해 CTest가 테스트를 인식하고 실행할 수 있도록 설정한다.

CTest 실행 절차

  1. 빌드 디렉토리 생성 및 이동:
    mkdir build
    cd build
  2. CMake 실행:
    cmake ..
  3. 빌드 실행:
    cmake --build .
  4. CTest 실행:
    ctest

이 명령어들을 실행하면, CTest가 설정된 테스트를 실행하며 add_test()로 등록된 모든 테스트가 수행된다.

고급 설정

CTest는 다양한 고급 기능을 제공하며, 이를 통해 테스트를 그룹으로 나누거나 병렬로 실행할 수 있다.

테스트 그룹 설정

# 여러 개의 테스트 추가
add_test(NAME Test1 COMMAND MyExecutable arg1)
add_test(NAME Test2 COMMAND MyExecutable arg2)

# 테스트 그룹 설정
set_tests_properties(Test1 PROPERTIES LABELS "group1")
set_tests_properties(Test2 PROPERTIES LABELS "group2")

병렬 테스트 실행

테스트를 병렬로 실행하려면 -j 옵션을 사용한다.

ctest -j4

이 명령어는 4개의 병렬 작업으로 테스트를 수행한다.

테스트 타임아웃 설정

각 테스트에 타임아웃을 설정할 수 있다.

set_tests_properties(Test1 PROPERTIES TIMEOUT 10)

이 설정은 Test1이 10초 이상 실행되지 않도록 한다.

CTest와 CDash 연동

CTest는 CDash라는 웹 기반 대시보드와 연동해 테스트 결과를 시각화하고 관리할 수 있다. 이를 위해 CTest 설정을 CMakeLists.txt에 추가해야 한다.

# CDash 설정
set(CTEST_PROJECT_NAME "MyProject")
set(CTEST_NIGHTLY_START_TIME "01:00:00 UTC")

# CTestConfig.cmake 파일 생성
file(WRITE "${CMAKE_BINARY_DIR}/CTestConfig.cmake"
  "set(CTEST_PROJECT_NAME \"MyProject\")\n"
  "set(CTEST_NIGHTLY_START_TIME \"01:00:00 UTC\")\n"
  "set(CTEST_DROP_METHOD \"http\")\n"
  "set(CTEST_DROP_SITE \"cdash.example.com\")\n"
  "set(CTEST_DROP_LOCATION \"/submit.php?project=MyProject\")\n"
  "set(CTEST_DROP_SITE_CDASH TRUE)\n"
)

# CPack 설정
include(CTest)

이 설정은 CTest가 테스트 결과를 CDash 서버에 업로드할 수 있도록 구성한다.

예제 프로젝트

간단한 C++ 프로젝트 예제는 다음과 같다.

main.cpp

#include <iostream>
int main(int argc, char** argv) {
    if (argc > 1 && std::string(argv[1]) == "arg1") {
        std::cout << "Test1 passed\n";
        return 0;
    }
    std::cout << "Test2 passed\n";
    return 0;
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(MyProject)

# 소스 파일 추가
add_executable(MyExecutable main.cpp)

# CTest 사용 설정
enable_testing()

# 테스트 추가
add_test(NAME Test1 COMMAND MyExecutable arg1)
add_test(NAME Test2 COMMAND MyExecutable)

이 예제는 main.cpp를 빌드하고 두 개의 테스트를 추가한다. ctest 명령어를 사용해 테스트를 실행할 수 있다.

728x90

+ Recent posts