Date Редакция Категория comp Теги C

Учил С по K&R, но прочитал Бена Клеменса (Ben Klemens. 21st Century C: C Tips from the New School, O'Reilly Media, 2012, 296 p.) и вдохновился на использование "новинок".

Аннотация: сделано как в C++. При этом сохранена компактность языка и его нацеленность на быстродействие.

  1. Не обязательно возвращать целое значение в функции main(). return 0; генерируется автоматически.

  2. Возможность объявления переменных внутри блоков и вблизи от места использования, т. е.

Вместо

#include <stdio.h>

int main()
{
    int i;
    double ratio, denom = 7;
    ...
    for (i=1; i<= 6; i++) {
        ratio = i/denom;
        printf("%g\n", ratio);
    }
}

можно использовать

#include <stdio.h>

int main()
{
    ...
    double denom = 7;
    for (int i=1; i<= 6; i++) {
        double ratio = i/denom;
        printf("%g\n", ratio);
    }
}

Причем то, что переменная ratio объявляется внутри цикла, не означает, что на каждом шаге под нее заново выделяется память, и работа программы не замедляется.

  1. Однострочные комментарии, начинающиеся с //.

  2. Новые типы данных, в частности:

  3. long long int -- расширенный целый тип (а то long int зачастую равен все тем же 4-м байтам);

  4. явный логический тип;
  5. тип complex для представления комплексных чисел.

  6. Определение размера массива во время выполнения.

int maxnum = 10;
int data[maxnum];

теперь работает, равно как и

#include <stdlib.h>

int main(int argc, char* argv[])
{
    int maxnum = atoi(argv[1]);
    int data[maxnum];
}
  1. Меньше явных приведений типов. Раньше malloc() возвращал char*, теперь он возвращает void*, который компилятор автоматически приводит к нужному типу. Поэтому вместо
double *list = (double *) malloc(10*sizeof(double));

можно записать

double *list = malloc(10*sizeof(double));
  1. Инициализация отдельных полей структур:
struct color
{
    int R;
    int G;
    int B;
};

struct color blue = { .B = 255 };

Пропущенные будут заполнены нулями. Структуры можно создавать в аргументах функций и возвращать из функций

struct color
{
    int R;
    int G;
    int B;
};

void print_color_info(struct color *c)
{
    printf("%i %i %i\n", c->R, c->G, c->B);
}

int main()
{
    print_color_info(&(struct color){ .G = 122 });
}

Как использовать

Указать в опциях компилятора:

-std=c99

Ложка дегтя

К сожалению, не все производители компиляторов, и среди них Microsoft, поддержали C99. Поэтому, если вы используете компилятор этой фирмы, то вопрос о поддерживаемых ею стандартах необходимо изучить дополнительно. Однако указанные новинки прошли испытание временем и включены в следующий стандарт -- C11, так что, как ни крути, производители подтянутся.



Комментарии

comments powered by Disqus