programing

C99의 가장 유용한 신기능은 무엇입니까?

prostudy 2022. 8. 8. 15:13
반응형

C99의 가장 유용한 신기능은 무엇입니까?

C99는 10년 이상 사용되었지만 지원이 늦었기 때문에 대부분의 개발자는 C89를 고수하고 있습니다.지금도 가끔 C코드의 C99 기능을 보면 약간 놀라곤 합니다.

대부분의 주요 컴파일러가 C99를 지원하고 있기 때문에(MSVC는 주목할 만한 예외이며 일부 임베디드 컴파일러도 뒤처져 있음), C를 사용하는 개발자는 C99의 기능에 대해 알고 있어야 한다고 생각합니다.은 지금까지되지 않은 입니다.snprintf들어 변수 배치 한 줄 C++)에서 .//C99에서 처음 도입된 새로운 기능 중 일부는 많은 프로그래머에게 익숙하지 않습니다.

C99의 가장 유용한 신기능은 무엇입니까?

참고로 C99 표준(초안으로서 라벨이 붙어 있지만 갱신된 표준과 동일한 것으로 알고 있습니다), 신기능 리스트 및 GCC C99의 실장 상태.

답변당 1개씩 부탁드립니다.여러 개의 답변을 자유롭게 남겨주세요.새로운 기능을 보여주는 짧은 코드 예를 사용하는 것이 좋습니다.

타이핑하는 게 너무 익숙해서

for (int i = 0; i < n; ++i) { ... }

C++에서는 C99 이외의 컴파일러를 사용하는 것이 귀찮다는 것을 알고 있습니다.

int i;
for (i = 0; i < n; ++i ) { ... }

를 정의합니다stdint.h.int8_t,uint8_t정수 너비에 대해 휴대할 수 없는 추측을 할 필요가 없어졌습니다.

uint32_t truth = 0xDECAFBAD;

나는 새로운 이니셜라이저 메커니즘이 매우 중요하다고 생각한다.

struct { int x, y; } a[10] = { [3] = { .y = 12, .x = 1 } };

확인 - 설득력 있는 예는 아니지만 표기법은 정확합니다.배열의 특정 요소 및 구조물의 특정 구성원을 초기화할 수 있습니다.

아마도 더 좋은 예는 다음과 같습니다. - 그다지 설득력이 있는 것은 아니지만요.

enum { Iron = 26, Aluminium = 13, Beryllium = 4, ... };

const char *element_names[] =
{
    [Iron]      = "Iron",
    [Aluminium] = "Aluminium",
    [Beryllium] = "Beryllium",
    ...
};

snprintf()- 정말이지 안전하게 포맷된 스트링을 할 수 있다는 것은 큰 가치가 있습니다.

다음 문자로 시작하는 한 줄 코멘트 지원//.

지원inline기능들.

가변 길이 배열:

int x;
scanf("%d", &x);
int a[x];
for (int i = 0; i < x; ++i)
    a[i] = i * i;
for (int i = 0; i < x; ++i)
    printf("%d\n", a[i]);

복합 리터럴.멤버별 구조 설정은 '89'입니다.)

또한 불필요한 변수를 선언하지 않고 자동 저장 기간이 설정된 개체에 대한 포인터를 가져올 수도 있습니다.

foo(&(int){ 4 });

의 설치.

int tmp = 4;
foo(&tmp);

가변 매크로인수 수가 무제한인 보일러 플레이트 코드를 쉽게 생성할 수 있습니다.

16진 부동 소수점 상수(0x1.8p0f및 변환 지정자(%a,%A낮은 수준의 수치를 자주 다루면 십진수 리터럴이나 환산보다 크게 향상됩니다.

알고리즘의 상수를 지정할 때 반올림에 대한 걱정에서 벗어나 저수준 부동소수점 코드를 디버깅하는 데 매우 유용합니다.

restrict키워드를 지정합니다.특히 숫자를 계산할 때...

불 타입.

다음과 같은 작업을 수행할 수 있습니다.

bool v = 5;

printf("v=%u\n", v);

인쇄하다

1

복합 리터럴은 이미 언급되어 있습니다만, 여기 설득력 있는 예가 있습니다.

struct A *a = malloc(sizeof(*a));
*a = (struct A){0};  /* full zero-initialization   */
/* or */
*a = (struct A){.bufsiz=1024, .fd=2};   /* rest are zero-initialized.  */

이는 데이터가 힙 상에 있더라도 데이터를 초기화하는 명확한 방법입니다.어떤 것을 제로 초기화 하는 것을 잊는 방법은 없습니다.

블록 시작 이외의 위치에 변수를 선언할 수 있습니다.

유연한 어레이 멤버

6.7.2.1 구조 및 조합 규격

특별한 경우로서 복수의 이름 있는 부재를 가진 구조의 마지막 요소는 불완전한 배열 타입을 가질 수 있습니다.이것은 "exitable 배열 멤버"라고 불립니다.두 가지 예외를 제외하고 "exterable" 어레이 멤버는 무시됩니다.먼저, 구조체의 크기가 달리 동일한 구조체의unspecified 길이의 배열)둘째, 할 때 한.(또는 ->.)연산자는 왼쪽 피연산자가 있(에 대한 포인터)flexible 배열 멤버이자 오른쪽 피연산자가 있는 구조체 이름을 지어 membe과flexible 배열 멤버를 대신하는 마지막 요소의 오프셋에 동등하다.r, 그것는, 그 멤버가 액세스 하는 오브젝트보다 큰 구조를 가지지 않는 최장 어레이(동일한 요소 타입)로 교환된 것처럼 동작합니다.배열 오프셋은 교환 어레이의 오프셋과 다른 경우에도, 어레이의 오프셋은 δexable 어레이 멤버의 오프셋으로 유지됩니다.이 배열에 요소가 없는 경우 하나의 요소가 있는 것처럼 동작하지만 해당 요소에 액세스하거나 포인터를 생성하려고 시도하면 동작이 정의되지 않습니다.

예제:

typedef struct {
  int len;
  char buf[];
} buffer;

int bufsize = 100;
buffer *b = malloc(sizeof(buffer) + sizeof(int[bufsize]));

Unicode 이스케이프 시퀀스 지원:

printf("It's all \u03B5\u03BB\u03BB\u03B7\u03BD\u03B9\u03BA\u03AC to me.\n");

또는 리터럴 유니코드 문자:

printf("日本語\n");

(주의: 로케일에 따라서는 동작하지 않을 수 있습니다.다른 인코딩에 대한 휴대용 지원은 이보다 더 많은 작업이 필요합니다.)

개인적으로 IEC 60559:1989(마이크로프로세서 시스템의 2진수 부동소수점 연산)의 인정과 훨씬 더 나은 부동소수점 지원을 좋아합니다.

마찬가지로 부동소수점 반올림 모드 설정 및 쿼리, Nan/Infinity/비정규수 확인 등을 할 수 있다.

언급URL : https://stackoverflow.com/questions/2047065/what-are-the-most-useful-new-features-in-c99

반응형