[C] C99~C11 조금 낯선 기능들

언어/C 2018. 12. 30. 20:53

구조체 리터럴 (C99)

변수명 없이 임시적으로 생성되는 구조체 리터럴을 선언할 수 있다.

(struct 구조체명) { 요소들...}


구조체 지정 초기화 (C99)

멤버를 직접 지정해서 초기화한다.
보다 명시적이고, 순서와 관련없이 대입해 넣을 수 있다.

여기엔 두가지 방법이 있는데, 
.과 =을 쓰는 방법이 이것이다.

= { .멤버명 = 대입값, ...};




근데 매번 .을 붙이려면 그것도 꽤 귀찮지 싶다.
그런 이들을 위한 두번째 방법이 있다.

= {멤버명 : 대입값, ...};



Flexible 배열 멤버 (C99)

아래와 같이 길이가 정해지지 않은 구조체 멤버 배열을 사용하는 기능이다.

struct flex_t{
    int age;
    char name[];
};

여기에는 몇가지 주의사항과 제약사항이 있다.
사실 좀 많이 까다롭다.
일단 위처럼 플렉서블 배열은 맨 뒤에 와야 한다.
그리고 다른 멤버가 하나 이상 있어야 한다.

일반적인 방법으로 사용하지도 못한다. 길이가 없기 때문에 메모리에 그를 위한 공간이 할당되지 않기 때문이다. 
위에서 사용한 구조체 리터럴 예제에 플렉서블을 사용하면 에러가 난다.

그럼 어떻게 써야할까?


결국 동적으로 할당해서 써야한다..

게다가 배열의 추가용량까지 써줘야 한다. 이렇게.



그리고 배열의 특성 중 하나인 '길이' 도 없다.


체크불가.


도대체 왜 넣은 기능인지 모르겠다. 
불편하기만 하고 쓸모없다.



익명 구조체 (C11)

구조체 안에다가 이름없는 구조체를 사용할 수 있는 기능이다.

내부의 익명 구조체 멤버는 외부의 구조체 멤버와 같이 액세스를 할 수 있다.

사실 이건 별로 쓸모가 없다. 그냥 중괄호 빼고 합쳐버리지.

어쨌든 이렇게 쓸 수 있다.



익명 공용체 (C11)

익명 공용체는 익명 구조체와 동작방식이 유사하다. 하지만 더 쓸모가 있다.

가끔 비트나 메모리 갖고 장난치다보면 구조체에 공용체를 멤버로 집어넣을 때가 있는데, 
이러면 접근시 공용체의 이름까지 써야 하기 때문에 호출하기가 굉장히 귀찮아진다.

그럴때 이걸 사용하면 번거로움을 줄일 수 있다.




__Noreturn (C11)

함수가 반환하지 않고 종료가 됨을 명시한다.

대표적으로 프로그램을 종료하는 exit함수가 이것으로 수식을 하고 있다.

근데 뭐 직접 쓸 일은 별로 없을 것 같다.





_Static_assert (C11)

c++의 static_assert와 동일하다.

컴파일타임에 assert를 뱉는다.

첫번째 인자는 논리식을 받아서 참이면 수행하고, 거짓이면 컴파일을 중단하고 두번째 인자의 문자열을 뱉는다.

성공



실패



이중자/삼중자 (C99)

어떤 키보드는 C에서 필수적으로 사용되는 기호들을 제공하지 않기도 한다.

그래서 흔한 기호를 2~3개의 기호를 조합해서 대체할 수 있게끔 이중자와 삼중자라는 것을 제공한다.

삼중자는 ""보다 우선순위가 높지만 이중자는 그렇지 않다.

# => 삼중자: ??=    이중자: %:

[  => 삼중자: ??(     이중자: <:

]  => 삼중자: ??)     이중자: :>

{  => 삼중자: ??<    이중자: <%

}  => 삼중자: ??>    이중자: %>

\  => 삼중자: ??/

|   => 삼중자: ??!

^  => 삼중자: ??`

~ => 삼중자: ??-


인라인 함수 (C99)

키워드는 inline이고 사용방법은 c++과 동일하다.




2018. 8. 31.



설정

트랙백

댓글