LINUX.ORG.RU

ansi c89 vs c11

 


0

2

В официальном guide разработчиков linux нет чётких указаний версии спецификации с.

Если верить http://stackoverflow.com/a/20664429, то linux kernel разрабатывается под c89.

Согласно вики первый стандарт c++ вышел примерно в одно и то же время с c99 - т.е. есть значительное влияние c++ на c.

Как вы думаете, имеет ли смысл останавливаться на «каноничном» c89, с запретом на смешивание переменных и кода, и т.д.?

Как вы думаете, имеет ли смысл останавливаться на «каноничном» c89, с запретом на смешивание переменных и кода, и т.д.?

Только если тебе 50, ты не способен усваивать новую информацию, пишешь софт под железо 20-летней давности и у тебя дома живёт маньяк, угрожающий отрезать тебе ноги за использование компилятора, выпущенного после 2000 года. В любой другой ситуации отказываться от бесплатных плюшек - крайне тупая идея.

hateyoufeel ★★★★★
()

ansi c89 vs c11

Эскобар.жпг

Как вы думаете, имеет ли смысл останавливаться на «каноничном» c89, с запретом на смешивание переменных и кода, и т.д.?

C89 имеет смысл использовать только если это жесткое требование целевой платформы (некро QNX4 например), во всех остальных случаях лучше использовать что-нибудь другое.

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

23

Мне нравится идея объявления переменных только в начале функции; c99 и c11 не принесли ничего значительно полезного и нового, imho, кроме стандартизации потоков.

fake93account
() автор топика

... имеет ли смысл останавливаться на «каноничном» c89, с запретом на смешивание переменных и кода, и т.д.?

Если не собираешься всё время писать код как удак, то смысла нет.

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

c99 и c11 не принесли ничего значительно полезного и нового, imho, кроме стандартизации потоков.

Да ну? Инфа из википедии:

C99 introduced several new features, many of which had already been implemented as extensions in several compilers:
* inline functions
* intermingled declarations and code: variable declaration is no longer restricted to file scope or the start of a compound statement (block), facilitating static single assignment form
* several new data types, including long long int, optional extended integer types, an explicit boolean data type,
* variable-length arrays
* new library functions, such as snprintf
* support for variadic macros (macros with a variable number of arguments)

The standard [C11] includes several changes to the C99 language and library specifications, such as:
* Alignment specification (_Alignas specifier, _Alignof operator, aligned_alloc function, <stdalign.h> header file)
* Removal of the gets
* Anonymous structures and unions
* Static assertions

А так да. С другой стороны, C с его костылями неплохо было бы перестать использовать как ЯП для написания программ руками.

hateyoufeel ★★★★★
()

ядро собирается с флагом -std=gnu89 что приблизительно равно с90 плюс gcc расширения и некоторые фичи из c99 (например однострочные комментарии)

pftBest ★★★★
()
Последнее исправление: pftBest (всего исправлений: 1)
Ответ на: комментарий от hateyoufeel

Если я правильно понимаю, inline функции не являются важной возможностью; обновлённую стандартную библиотеку, по-идее, можно заменить на кастомные библиотеки.

Идея мешать объявления переменных и код - ужасна.

variable-length arrays - не нужны, можно использовать нормальные структуры данных.

С другой стороны, C с его костылями неплохо было бы перестать использовать как ЯП для написания программ руками.

Ты серьёзно? Думаешь, проекты типа linux kernel удобнее писать на плюсах?

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

Идея мешать объявления переменных и код - ужасна.

Ужасно находить такой код в продакшене, потому что кто-то решил сэкономить на локальных переменных.

int i;
for (i = 0; i < foo; i++) {
  for (i = 0; i < bar; i++) {
  }
}

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

Если я правильно понимаю, inline функции не являются важной возможностью;

Ты неправильно понимаешь.

обновлённую стандартную библиотеку, по-идее, можно заменить на кастомные библиотеки.

А можно добавить основные плюшки в стандартную библиотеку.

variable-length arrays - не нужны, можно использовать нормальные структуры данных.

Имеется ввиду код типа такого:

int s = get_some_size();
int array[s] = { 0 };

Массив при этом будет на стеке и его не нужно освобождать. По сути это вызов alloca.

Ты серьёзно? Думаешь, проекты типа linux kernel удобнее писать на плюсах?

Я считаю, что проекты типа linux kernel, а именно монолиты на миллионы строк кода, писать не нужно ни на каком языке.

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

Я считаю, что проекты типа linux kernel, а именно *монолиты* на миллионы строк кода, писать не нужно ни на каком языке.

сразу видно человека, который никогда не читал код ядра, а чего ждать от мамкиного кодера-то еще?)

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

А можно добавить основные плюшки в стандартную библиотеку.

И что там, только snprintf()? Ну решили прибить гвоздями в стандарт де-юре то, что де-факто было реализовано давным давно напрашивающее. Хотя на самом деле расширение libc давно напрашивалось, слишком там всё устарело и превратилось в г* мамонта из-за перестраховки, что вдруг найдётся архитектура, где сделать тот же varargs накладно. Потому, например, (v)asprintf() будем ещё бог знает сколько в стандарте ждать, а stdio с работой с памятью, а не файлом похоже не дождёмся до появления в стандарте никогда.

Массив при этом будет на стеке и его не нужно освобождать. По сути это вызов alloca.

Вот именно, что это синтаксический сахар к alloca(). Как следствие, можем получить говнокод, где стек жрут тоннами, вместо того, чтобы проверить что много и потому желательно таки malloc(), программы будут падать в неожиданных местах.

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

О, а вот и старпёры подтянулись.

Идея мешать объявления переменных и код - ужасна.

Переменная должна объявляться там где используется. Это очень простая даже для тебя мысль, и оспорить её нечем. Объявление переменных в начале не продиктовано ничем кроме убогости компиляторов 30 лет назад, и считать его нормальным может только человек с синдромом утёнка в терминальной стадии или тролль.

Ты серьёзно? Думаешь, проекты типа linux kernel удобнее писать на плюсах?

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

anonymous
()

Если не писать на c89 то зачем писать на C? Если хочется новых фич, то зачем писать на C? Вполне имеет смысл следовать тому стандарту что наиболее популярен в среде, где будет использоваться твоя поделка. Если там популярен с11, то тогда да.

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

Переменная должна объявляться там где используется.

можно в фигурные скобочки это дело завернуть и объявлять где захочется

void somefunc()
{
  int var1;

  do_something(var1);

  {
    int var2;
    do_something(var2);
  }
}
Harald ★★★★★
()
Ответ на: комментарий от fake93account

О, а вот и старпёры подтянулись.

Идея мешать объявления переменных и код - ужасна.

Переменная должна объявляться там где используется. Это очень простая даже для тебя мысль, и оспорить её нечем. Объявление переменных в начале не продиктовано ничем кроме убогости компиляторов 30 лет назад, и считать его нормальным может только человек с синдромом утёнка в терминальной стадии или тролль.

Ты серьёзно? Думаешь, проекты типа linux kernel удобнее писать на плюсах?

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

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

не продиктовано ничем кроме убогости компиляторов 30 лет назад

Вы не справеделивы, не 30, а около 50. Ни тогда, когда 64k на всё про всё, ни сейчас это уже никакая не убогость, а необъяснимая упёртось в следовании давно ничем не обоснованным на данный момент стандарту.

небезопасный, неудобный, убогий и медленный в разработке язык

Про убогость уже прояснено, а про всё остальное это и сейчас бывает последнее, что по важности надо чинить vs переносимый ассемблер. Ибо последнее — оксюморон по определению.

vodz ★★★★★
()

Стараюсь везде, где только можно, писать на C89, но если использую openmp и в некоторых других случаях — то c99.

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

C с его костылями неплохо было бы перестать использовать как ЯП для написания программ руками

Можно подумать, есть что-то лучше!

Не быдлячие же кресты юзать! Или ты вообще начнешь про хипстерские расто-го вещать? Они ж вообще для наркоманов конченых!!!

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

Ядро уже перестало быть монолитом, падающим от ошибки вообще в любом драйвере? Может ты ещё скажешь, что недавний privilege escalation через баг в сетевом коде всем привидился?

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

Ядро уже перестало быть монолитом, падающим от ошибки вообще в любом драйвере? Может ты ещё скажешь, что недавний privilege escalation через баг в сетевом коде всем привидился?

для таких как вы мозилла создала целое сообщество, идите со своим ценным мнением в чатики раста и пишите там про эту самую микроядерность. не засоряйте интересные темы

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

Идея мешать объявления переменных и код - ужасна.

Идея заставлять объявлять все переменные в начале — ужасна.

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

очевидно же: оба подходят, чтобы вбрасывать по поводу linux (ядра)

в растосообществе любят таких мамкиных Экспертов, которые «не любят» то и это, при этом не удосуживаются прочитать техническую аргументацию монолитности ядра Linux от людей в н-цать раз умнее их(да, я про Торвальдса). в этих ржавых чатиках много чего «не любят» и все аргументируют «личными ощущениями» и анальным зудом. Технических аргументов вам никогда не приведут, только поморщатся.

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

Почему?

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

И, да, можно добавить в любом месте фигурные скобки, и в них проинициализировать временные переменные.

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