반응형

C++11 for 문

  • Java, C#의 foreach()와 유사함
  • STL(C++ 표준 라이브러리)의 list, vector 등의 컨테이너 사용가능
  • 사용자 정의 list도 사용가능(추가 작업 필요)
#include <iostream>
int main()
{
    int x[5] = { 1,2,3,4,5 };

    // C++11 for
    for ( int n : x )
    {
        std::cout << n << std::endl;
    }

    // C++11 for
    for ( auto n : x ) // 편하게 auto 권장
    {
        std::cout << n << std::endl;
    }

    // C++11 하위 for
    for (int i = 0; i < 10; i++)
    {
        std::cout << n << std::endl;
    }

}


C++17 if init, switch init, if constexpr

  • 조건문(if, switch)에 초기화 구문을 포함 가능
  • if( 초기화문; 조건문 ), switch( 초기화문; 조건문 )
  • if constexpr( 컴파일 시간 조건문 ), 컴파일 시간의 상수 조건만 확인 가능, 템플릿 프로그래밍에서 
#include <iostream>
int main()
{
    // C++17 if
    if ( int result = foo(); result == 1) { }

    // C++17 switch
    switch( int result = foo(); result ) { }

    // C++17 if constexpr
    constexpr int a = 1;
    if constexpr ( a == a) { }

    // 이전 if
    int result = foo();
    if ( result == 1 ) {}

    // 이전 switch
    int result = foo();
    switch( result ) {}
}


반응형

'프로그래밍 언어 > C++' 카테고리의 다른 글

C++ 함수 특징 #2  (0) 2019.05.05
C++ 함수 특징 #1  (0) 2019.05.05
C++ 변수의 특징(variable) #2  (0) 2019.01.15
C++ 변수의 특징(variable) #1  (0) 2019.01.14
C++ 표준 입출력(Basic Input/Output)  (1) 2019.01.13

반응형

C++ 상수를 만드는 방법

  • const : 초기값으로 literal뿐 아니라 변수도 사용 가능하다.
  • constexpr : 컴파일 시간 상수, 초기값으로 컴파일 시간에 결정된 값만 사용해야 한다. // C++11
  • 컴파일 타임 상수는 constexpr을 사용하자.
int main()
{
    int n = 10;

    const int c1 = 10;    // OK(컴파일타임 상수)
    const int c2 = n;    // OK(런타임 상수)

    constexpr int c1 = 10;    // OK(컴파일 타임 상수)
    constexpr int c2 = n;    // Error(런타임 상수는 불가)
}

 

C++ 문자열(STL string)

  • string 타입을 사용하자.(STL의 string 클래스)
    • 문자열 처리가 정수형 변수 처럼 직관적으로 사용 할 수 있다.
    • C언어의 const char*로의 변환이 필요하면 .c_str()을 사용한다.
  • C언어에서는 문자열
    • char* 또는 char 배열 사용
    • 복사 및 비교를 위해서는 문자열 전용 함수를 사용
#include <iostream>
#include <string.h>
#include <string>

int main()
{
    // C Style
    char s1[] = "hello";
    char s2[10];

    strcpy(s2, s1);
    if(strcmp(s2, s1) == 0)
    {
    }

    // C++ STL
    std::string s1 = "hello";
    std::string s2;
    
    s2 = s1; // C언어 strcpy(s2, s1) 동일
    if (s1 == s2) // C언어 strcmp(s2, s1) == 0 동일
    {
    }
    
    std::string s3 = s1 + s2;
    std::cout << s3 << std::endl;
}

 

C++ 구조체 바인딩(Structure binding) // C++17

  • 구조체 또는 배열의 각 멤버에서 값을 꺼낼때 사용
  • 타입은 반드시 auto를 사용해야 한다.

struct Point

{

int x = 10;

int y = 20;

};

 

int main()

{

Point p;

 

// 기존 Point 구조체의 멤버값을 복사

int a = p.x;

int b = p.y;

 

// Structure binding을 이용 복사(구조체)

auto [a, b] = p;

 

// Structure binding을 이용 복사(배열도 가능, 배열의 아이템 수가 일치해야 함)

int x[2] = { 1,2 };

auto[a,b] = x;

}

 

 

반응형

반응형

C++ 변수 특징

  • 2진수 표기법, 자릿수 표기법(C++11)
  • 변수의 중간 선언 가능.
  • bool 타입 지원 // C언어(C99)도 가능 했음
  • 구조체 만들때 멤버를 초기화 할 수 있음(C++11)
struct Point
{
int x = 0; // 생성 타임에 멤버 초기화 가능. C++11
int y = 0;
};

int main()

{

struct Point p1; // C Style

Point p2; // C++ Style


int n1 = 0b00; // 2진수로 표현시 C++11

int n2 = 1'000'000; // 자리수가 클 경우 콤마 처럼 ' 으로 구분하여 표시 가능 C++11


int n3 = 0; // 함수 중간에 변수선언 가능.

bool b = true; 

}



일관된 초기화(Uniform Initialization) // C++11

  • 중괄호 초기화(Brace Initialization)라고도 부른다.
  • 직접 초기화(Direct Initialization) : 초기화시에 '=' 을 사용하지 않는다.
  • 복사 초기화(Copy Initialization) : 초기화시에 '=' 을 사용한다.
  • 묵시적 형변환 지원하지 않음

직접 초기화(Direct Initialization)

int n1{ 0 };

int n2{ 0 };

int x[2]{ 1, 2 };

Point p{ 1,2 };


복사 초기화(Copy Initialization)

int n1 = { 0 };

int n2 = { 0 };

int x[2] = { 1, 2 };

Point p = { 1,2 };



예제

int n1 = 3.4; // C Style로 초기화시 묵시적 형 변환되어 OK

int n2{ 3.4 }; // 데이터 타입 오류로 컴파일 Error


char c1{ 100 }; // OK

char c2{ 300 }; // 1Byte 초과로 Error


int n3{}; // 0 기본값으로 초기화됨




별칭(using)

  • typedef : 타입에 대해서 별칭(alias)을 만들때 사용
  • using : 타입과 template의 별칭(alias)을 만들때 사용(사용범위가 넓으므로 typedef 보단 using 권장)
// typedef
typedef int DWORD; // int 타입을 DWORD로 정의
typedef void(*F)(int); // void 함수 포인트 F로 정의

// using
using DWORD = int; // int 타입을 DWORD로 정의
using F = void(*)(int); // void 함수 포인트 F로 정의


int main()
{
DWORD n;
F f;
}


반응형

반응형

1. 기본 함수

 

 C++

 C

 헤더 파일

 <stdio.h>

<iostream>

 표준 입력

 scanf

std::cin

 표준 출력

 printf

std::cout

 개행

 '\n'

 std::endl or '\n'








#include <iostream>

int main()
{
    int n = 0;
    std::cin >> n;	// 숫자 입력
    std::cout << n;	// 입력 숫자 출력
}


2. 조정자(iomanipulator) 함수

  • 헤더 사용 : <iomanip>
  • 변환 출력 : std::dec(10진수), std::hex(16진수)
  • 문자열 출력 자리수 지정 : std::setw(10자리)
  • 문자열 출력 정렬(기본 우측 정렬) : std::left(좌측), std::right(우측)
  • 문자열 공백 문자 지정 : std::setfill('*')
#include <ostream>
#include <iomanip>
#include <string>

int main()
{
	int n = 0;
	std::string name = "harry";

	std::cin >> n;	// 숫자 입력
	std::cout << std::hex << n << std::endl; // 입력 숫자 16진수 출력
	std::cout << n << std::endl; // 입력 숫자 출력(16진수로 유지)
	std::cout << std::dec << n << std::endl;// 입력 숫자 10진수로 재변환 출력
	std::cout << name << std::endl;	// "harry" 문자열 출력
	std::cout << std::setw(10) << name << std::endl; // "harry" 문자열 10자리수로 출력(기본 우측 정렬)
	std::cout << std::setw(10) << std::setfill('#') << name << std::endl; // 공백 문자 '#' 채우기
	std::cout << std::setw(10) << std::left << name << std::endl; // "harry" 문자열 10자리수로 출력(좌측 정렬)
	std::cout << std::setw(10) << std::right << name << std::endl; // "harry" 문자열 10자리수로 출력(우측 정렬)
	std::cout << name << std::endl;

}


반응형

'프로그래밍 언어 > C++' 카테고리의 다른 글

C++ 함수 특징 #1  (0) 2019.05.05
C++ 제어문(if, switch)과 반복문(for)  (0) 2019.01.16
C++ 변수의 특징(variable) #2  (0) 2019.01.15
C++ 변수의 특징(variable) #1  (0) 2019.01.14
C++ 네임스페이스(Namespace)  (0) 2019.01.02

반응형
  • namespace 요소에 접근하는 3가지 방법
    • qualified name (  완전한 이름 )을 사용한 방법.
    • using declaration ( 선언 )을 사용한 방법.
    • using directive ( 지시어 )를 사용한 방법.

#include "pch.h"
#include <iostream>

// Harry namespace
namespace Harry
{
    void init() { printf("Harry Init\n"); }
    void destroy() { printf("Harry destroy\n"); }
}

// global namespace
void init()
{
    printf("Global init\n");
}

int main()
{
    std::cout << "Harry World!\n"; 

    // 1. 전체 이름 접근(qualified name)
    Harry::init(); // OK
    Harry::destroy(); // OK

    // 2. using 선언 접근(using declaration)
    using Harry::init;
init(); // OK destroy() // Error // 3. using 지시어 접근(using directive) using namespace Harry;
init(); // OK destroy(); // OK
// 4. global namespace(전역 함수 호출) ::init(); // OK }


  • C++의 모든 표준 라이브러리는 std namespace 안에 있다.
  • C++ 표준 라이브러리를 사용하는 3가지 방법
    • qualified name ( 완전한 이름 )을 사용한 방법 -> std::min(1, 2)
    • using declaration ( 선언 )을 사용한 방법 -> using std::min;
    • using directive ( 지시어 )를 사용한 방법 -> using namespace std;
      • using namespace std;를 사용할 경우 이름 충돌에 주의 필요
    • 표준 라이브러리를 완전한 이름을 사용하는 것이 좋다.
  • 표준 라이브러리 헤더 파일 모양
    • C : 파일 이름 뒤에 .h 를 붙인다. -> <stdio.h>
    • C++ : 파일 이름 뒤에 .h 가 붙지 않는다. -> <cstdio>
    • 사용자가 헤더를 만들때는 .h 를 붙이는 것이 관례이다. -> "myheader.h"
  • C++에서 C언어 헤더 사용하는 방법
    • 기존의 C언어 헤더 파일을 모두 계속 사용할 수 있다.
    • C언어 헤더에서 '.h'를 제거하고 앞에 'c'를 붙여서 사용한다.
      • <string.h> -> <cstring>
      • <stdlib.h> -> <cstdlib>
      • <math.h> -> <cmatch>


반응형

반응형

No toolchains found in the NDK toolchains folder for ABI with prefix: mips64el-linux-android


오랜만에 안드로이드 스튜디오 최신 버전으로 업데이트 후 Gradle 및 NDK 버전을 올렸더니 프로젝트 Sync할때 아래와 같은 에러가 나네요.


SDK Manager를 실행 후 CMake와 NDK를 다시 설치 해보아도 증상이 해결 되지 않아서 NDK 릴리즈 노트 확인 해보니

NDK r17c 버전부터 ARMv5 (armeabi), MIPS, and MIPS64 ABI가 더이상 지원되지 않아서 삭제 되었네요.

실제로 android-sdk폴더/ndk-bundle/toolchains/ 폴더내에 mips64로 시작하는 폴더가 보이질 않습니다.


Android NDK, Revision r17c (June 2018)

https://developer.android.com/ndk/downloads/revision_history

  • GCC is no longer supported. It will be removed in NDK r18.
  • libc++ is now the default STL for CMake and standalone toolchains. If you manually selected a different STL, we strongly encourage you to move to libc++. Note that ndk-build still defaults to no STL. For more details, see this blog post.
  • gnustl and stlport are deprecated and will be removed in NDK r18.
  • Support for ARMv5 (armeabi), MIPS, and MIPS64 has been removed. Attempting to build any of these ABIs will result in an error.
  • Support for ICS (android-14 and android-15) will be removed from r18.
  • The Play Store will require 64-bit support when uploading an APK beginning in August 2019. Start porting now to avoid surprises when the time comes. For more information, see this blog post.

저는 우선 NDK r16b를 받아서 android-sdk 폴더내 ndk-bundle/toolchains/mips64el-linux-android-4.9에 복사하여 해결 하였습니다.


반응형

반응형

언리얼 사용중 Mac에서 uproject로 XCode 프로젝트 생성시 에러


Exception: Invalid SDK MacOSX.sdk, not found in /Library/Developer/CommandLineTools/Platforms/MacOSX.platform/Developer/SDKs



$ sudo xcode-select -reset

반응형

반응형


1. 이미지 리스트 보기

https://docs.docker.com/engine/reference/commandline/images/

docker images

2. 이미지 삭제 

https://docs.docker.com/engine/reference/commandline/rmi/

docker rmi {REPOSITORY or IMAGE ID}

3. 컨테이너 리스트 보기

https://docs.docker.com/engine/reference/commandline/ps/

docker ps -a

-a 옵션이 없으면 실행중인 컨테이너만 보여줌

4. 컨테이너 삭제

https://docs.docker.com/engine/reference/commandline/rm/

docker rm {CONTAINER ID}

5. 컨테이너 실행

https://docs.docker.com/engine/reference/commandline/start/

docker start {CONTAINER ID}

6. 컨테이너  중지

https://docs.docker.com/engine/reference/commandline/stop/

docker stop {CONTAINER ID}

7. 실행중인 컨테이너에 연결

https://docs.docker.com/edge/engine/reference/commandline/exec/

https://docs.docker.com/engine/reference/commandline/attach/

// 두가지 방법이 있음
docker exec -it {CONTAINER ID} /bin/bash
docker attach {CONTAINER ID}

attach로 접속 시 컨테이너 접속을 종료할때는 반드시 아래의 명령을 실행해야 합니다

Ctrl + p + q

그냥 일반적 쉘 종료로 사용하는 'exit' 명령을 사용하면 실행중이던 컨테이너는 종료됩니다.

8. 현재 컨테이너를 이미지로 만들기

https://docs.docker.com/engine/reference/commandline/commit/

docker commit {CONTAINER ID} {IMAGE NAME}

9. 이미지를 File로 Export

https://docs.docker.com/engine/reference/commandline/save/

docker save -o {FILE NAME} {REPOSITORY or IMAGE ID}


반응형

+ Recent posts