LINUX.ORG.RU

Опубликован новый стандарт языка C: C11

 , ,


0

8

Международная Огранизация по Стандартизации (ISO) опубликовала новый международный стандарт языка программирования C: ISO/IEC 9899:2011, ранее известный как C1X. Основные изменения:

  • поддержка многопоточности;
  • улучшенная поддержка юникода;
  • обобщенные макросы (type-generic expressions, позволяют статичную перегрузку);
  • анонимные структуры и объединения (упрощают обращение ко вложенным конструкциям);
  • управление выравниванием объектов;
  • статичные утверждения (static assertions);
  • удаление опасной функции gets (в пользу безопасной gets_s);
  • функция quick_exit;
  • спецификатор функции _Noreturn;
  • новый режим эксклюзивного открытия файла.

Кроме того, определен ряд необязательных для реализации возможностей, включая новый набор безопасных функций (в т. ч. для работы с массивами с проверкой границ). В этот список также попали возможности, которые в предыдущем стандарте считались обязательными: комплексная арифметика, массивы переменной длины.

Некоторые возможности нового стандарта уже поддерживаются компиляторами GCC и Clang. Стоит, однако, отметить, что полной поддержки предыдущего стандарта C99 в этих и большинстве других компиляторов нет.

Последний черновик стандарта

>>> Подробности

★★★★

Проверено: Shaman007 ()
Последнее исправление: unsigned (всего исправлений: 4)

Ответ на: комментарий от Pavval

Это замена pthread. Которая лучше, т.к. платформеннонезависима

pthread есть на лине, фре, макоси и в цигвине. «замена» есть только на бумаге

ckotinko ☆☆☆
()
Ответ на: комментарий от I-Love-Microsoft

еще б они добавили простейшую модель объектов, не классов - сразу станет легче и светлее в мире

Зачем? Если нужен С со более развитыми средствами абстракции - есть С++, зачем из С делать недо-С++?

Begemoth ★★★★★
()
Ответ на: комментарий от anonymous

в венде есть нативные в пакете windows services for unix.

Некрофилы в треде!

Begemoth ★★★★★
()
Ответ на: комментарий от Vudod

И потому глюков и багов в программах на Питоне гораздо меньше, чем в C++, несмотря на более низкий в целом уровень квалификации.

ты видел большие проекты на питоне, скажем порядка 10 млн. строк? Догадаешься почему такие проекты пишут на С++?

anonymous
()
Ответ на: комментарий от matumba

угу (

а теперь из-за этого синтаксис превратили в говно (

sv75 ★★★★★
()
Ответ на: комментарий от Pavval

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

И что? gcc по умолчанию не станет же с11 наверняка никогда )

sv75 ★★★★★
()
Ответ на: комментарий от anonymous

Ядро виндовс написано на С++, с кусками на С и ассемблере. Обсуждалось уже 100 раз.

Нет там плюсов по-моему. Я видел Academic XP sources.

sv75 ★★★★★
()
Ответ на: комментарий от chinarulezzz

Только реальное чудо пользуется триграфами.

хорошо что язык Си притягивает чудиков :)

Ты судишь по себе, и это большая ошибка.

tailgunner ★★★★★
()
Ответ на: комментарий от Squeeze

RE: matumba у тебя крыша поехала что ли ты хоть понял что сказал ?

На третий год вождь Зоркий Глаз заметил неладное...

tailgunner ★★★★★
()
Ответ на: комментарий от anonymous

Shut up and show the code.

гугли - исходники win2000 были на торрентах, плюс потом M$ что-то сама стала раздавать в качестве учебного пособия

// другой анонимус

anonymous
()
Ответ на: комментарий от anonymous

Судя по нововведениям, там авторитетом выступает чемодан из «Страха и ненависти в Лас-Вегасе».

burjui
()
Ответ на: C11 от sjb

gcc поддерживает С99.

LongLiveUbuntu ★★★★★
()
Ответ на: комментарий от tailgunner

Ты судишь по себе, и это большая ошибка.

ошибки - удел сишников) Заменить потенциально опасную gets на gets_s в 2011 году - это да, достижение.)

chinarulezzz ★★
()
Ответ на: комментарий от matumba

переписать на C# или D

Но ведь для этого необходимо быть извращенцем.

quantum-troll ★★★★★
()
Ответ на: комментарий от chinarulezzz

ошибки - удел сишников)

Ты ходячее опровержение этого тезиса.

Заменить потенциально опасную gets на gets_s в 2011 году - это да, достижение.)

Ты отличаешь «заменить» от «выбросить»? Любой приличный Си-прогер знает о fgets, которая, наверное, старше тебя.

tailgunner ★★★★★
()
Ответ на: комментарий от anonymous

ты видел большие проекты на питоне, скажем порядка 10 млн. строк? Догадаешься почему такие проекты пишут на С++?

Нет. А с какого размера проект должен считаться большим? И что включать в код проекта? Есть причины, по которым проект на Питоне не достигнет такого размера.

Первая заключается в том, что это нерационально с точки зрения использования ресурсов, Питон пока слишком медленный и критичные кусочки переписываются на Fortran и C. Есть надежда на pypy, но всё равно это не окончательное решение. Вторая причина состоит в том, что код на Питоне существенно компактнее, чем на C++ и те же действия будут занимать в 3--5 раз меньше строк (ну вы можете, конечно, написать всю программу на C++ в одну строку, я не спорю). Третья --- это библиотеки. Вот у меня есть программа всего на ~4000 строк из 6 модулей, использующая numpy, scipy.special, scipy.optimize, matplotlib.pyplot, tkinter, os, time, multiprocessing. Считать ли функционал этих модулей частью моей программы?

Vudod ★★★★★
()
Ответ на: комментарий от tailgunner

Ты ходячее опровержение этого тезиса.

ну наконец-то открытый переход на личности) А то всё косвенно да косвенно :D

Ты отличаешь «заменить» от «выбросить»?

да. gets_s - замена gets.

Любой приличный Си-прогер знает о fgets, которая, наверное, старше тебя.

отличный костыль, чо, который кстати так же небезопасен )))

chinarulezzz ★★
()
Ответ на: комментарий от chinarulezzz

ну наконец-то открытый переход на личности)

Ты некомпетентен или хорошо прикидываешься таким. Если это переход на личности, okay.

Любой приличный Си-прогер знает о fgets, которая, наверное, старше тебя.

отличный костыль, чо, который кстати так же небезопасен )))

*shrug* Си вообще не является безопасным языком. Растолкуешь, в чем именно небезопасность fgets?

tailgunner ★★★★★
()
Ответ на: комментарий от matumba

Никакой «обратной совместимости» тут даже не требуется. Если кто-то назвал переменную foreach, ничего страшного - подымет зад и переименует во что-то другое. А вот вводят подчёркивания - точно не от большого ума.

Вот именно об этом я и говорю. Уж если даже в C++ проекте переименовать переменную или даже класс не составляет особо большой проблемы, то в C и подавно.

m0rph ★★★★★
()

удаление опасной функции gets (в пользу безопасной gets_s);

Зачем gets_s, если тыщу лет как есть fgets с указанием размера буфера?

anonymous
()
Ответ на: комментарий от tailgunner

Си вообще не является языком.

fix

Растолкуешь, в чем именно небезопасность fgets?

если рассматривать функцию изолированно, вакуумно, то конечно безопасно %) Но в программах он спасает только от строк заканчивающихся NULL символами, если же нет (ошибка ввода/вывода или over 100500 способов еще) , то следующий код опасен.

	char buf[10], cp_buf[10];
	fgets(buf, 10, stdin);
	strcpy(cp_buf, buf);

chinarulezzz ★★
()
Ответ на: комментарий от chinarulezzz

Растолкуешь, в чем именно небезопасность fgets?

если рассматривать функцию изолированно, вакуумно, то конечно безопасно %) Но в программах он спасает только от строк заканчивающихся NULL символами,

Ясно. С таким уровнем компетенции тебе лучше не лезть в разговоры о Си. Если, конечно, ты не прешься от переходов на твою личность.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

хах, как тебе важно сохранить лицо :D

Ладно, закрываю с тобой диалог))

chinarulezzz ★★
()
Ответ на: комментарий от anonymous

хах, как тебе важно сохранить лицо :D

Найди человека, которому это не важно.

закрываю с тобой диалог))

Черт, теперь навсегда останется загадкой - зачем ты его вообще открыл.

tailgunner ★★★★★
()
Ответ на: комментарий от anonymous

если будем до конца честными - то и strncpy не спасёт от ошибок) В том кусочке кода видно как fgets не спасает. В этом, как strncpy опасна:

#include <stdio.h>

int main(int argc, char **argv)
{
    char copy_buff[263];
    char exploit_string[1024]; /*second buffer $ARGV[1]*/
    char vuln_array[256]; /*first buffer $ARGV[0]*/

    if(argc <= 2){
        printf("%s\n","Use arg1 arg2");
        exit(0);
    }
    strncpy(vuln_array, argv[1], sizeof(vuln_array));  /*vulnerable function where we will write 256 bytes as defined in char 
    strncpy(exploit_string, argv[2], sizeof(exploit_string)); /*overflow will take place here*/
    sprintf(copy_buff,"MSG: %s\n",vuln_array);
    printf("%s\n",copy_buff);
    return(0);
}
chinarulezzz ★★
()
Ответ на: комментарий от ckotinko

Это замена pthread. Которая лучше, т.к. платформеннонезависима

pthread есть на лине, фре, макоси и в цигвине. «замена» есть только на бумаге

С++11 будет в GCC 4.7. C11 - максимум в 4.8, а, учитывая небольшие изменения, часть из которых входит в C++11, - то и в том же 4.7.

Pavval ★★★★★
()
Ответ на: комментарий от Vudod

Вот у меня есть программа всего на ~4000 строк из 6 модулей, использующая numpy, scipy.special, scipy.optimize, matplotlib.pyplot, tkinter, os, time, multiprocessing. Считать ли функционал этих модулей частью моей программы?

Нет, конечно. Большие проекты (на том же С++) тоже не сильно страдают велосипедостроением. Есть куча сторонних либ, которые дают все нужное. А процент велосипедостроения (по причинам NIH, специфики проекта, лицензий и т.д.) довольно мал, и большие проекты не сильно похудеют от вычитания размера велосипедов. Так что, когда говорят о миллионах строк в проекте, знай - это это действительно миллионы строк оригинального кода.

Pavval ★★★★★
()
Ответ на: комментарий от matumba

> Я как-то смотрю на этот Си - ну труп же трупом, а всё равно шевелят

Чего еще интересного расскажешь?

paran0id ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.