LINUX.ORG.RU

Стандарт языка Си

 ,


1

3

Всем привет. На многих ресурсах по программированию(да и в книгах) пишут, мол «Читай стандарт языка» или «По стандарту языка так делать нельзя» и т.п.
А где собственно взять этот самый стандарт? Как-то не нашёл книг/статей по этой теме, может кто подкинет что - нибудь?
p.s. Я говорю не про стандартные библиотеки, а про сам стандарт языка, C98/C99

Как-то не нашёл книг/статей по этой теме

Как это можно не найти? В статье про ANSI C на википедии внизу ссылки есть.

DELIRIUM ★★★★★ ()

Вообще С99 зверек интересный. Вроде как ни один компилятор на 100% его не поддерживает. Да и не исользуется он практически нигде, ну использует его части как расширения и только. По настоящему ходовой базой является с89. Я сам как-то пробовал его нагуглить, но ничего вроде не нашел толком. Но с89 с некоторыми оговорками является подмножеством с++98, так что можешь начать с него.

Dudraug ★★★★★ ()

а вообще С11 давно уже вышел

Harald ★★★★★ ()

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

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

плохой, негодный компилятор :)

надо тогда написать багрепорт, чтоб исправили

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

Что же такое есть в c99, что не поддерживает gcc?

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от Dudraug

Вообще С99 зверек интересный. Вроде как ни один компилятор на 100% его не поддерживает.

Сановский поддерживает. Видать, из принципа сделали. GCC поддерживает весьма здоровую долю, без шпаргалки пробелы в поддержке не найдёшь.

const86 ★★★★★ ()

Нашел табличку по c99 в gcc.

Интересно:

variable-length arrays Done

Это как? УМННР.

extended identifiers Missing

А это что за шняга?

// comments Done

Ну а это вообще давным-давно работает.

mixed declarations and code Done

Бью себя по рукам за это, но иногда так хочется...

Остальное либо используется и без -std=gnu99, либо как обыденность уже, либо на фиг не нужно.

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от Eddy_Em
#include <stdio.h>

int main()
{
  int size;
  scanf("%d", &size);
  int vla[size];
  vla[size-1] = 0;
}

У меня работает

Если я правильно понял то extended identifiers

#include <stdio.h>

int main()
{
  int сайз;
}

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

Это как? УМННР.

С -std=c99 работает. И у тебя тоже должно работать.

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

int vla[size];

А во что это скомпилируется? Можно ли будет изменять размер?

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

Блин, и правда работает:

#include <stdio.h>

int main(int argc, char **argv){
	int s;
	if(argc < 2) return -1;
	sscanf(argv[1], "%d", &s);
	printf("array size: %d\n", s);
	int arr[s];
	for(int i = 0; i < s; i++) arr[i] = i;
	printf("mid element: %d\n", arr[s/2]);
	
	return 0;
}
Класс!!!

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от GAMer

Подозреваю, что там автоматом malloc вызывается.

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

Ничего там не вызывается, это честный автоматический массив.

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

автоматический массив

Это как? Оперативку-то под него надо зарезервировать, т.е. надо вызывать alloca!

Хотя, и правда alloca не вызывается:

./a.out 11111111
array size: 11111111
Ошибка сегментирования
Массив, похоже, пытается разместиться в стеке.

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

Alloca не malloc. Автоматический значит на стеке, да. Отличие от alloca в том, что память развыделяется при выходе из скопа, тогда как alloca действует на всю функцию.

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

А надо бы вызывать malloc + free перед выходом из функции. Могли бы такую фичу в gcc запилить...

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

Alloca это собственно и есть выделение памяти прямо в стеке. Замени vla на alloca и получишь тот же фейл. Единственно, что alloca может границы проверяет, а может и нет.

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

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

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

Можно на макросах сделать нечто похожее.

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

Можно и без макросов это сделать :) Пишешь две функции: autofree(void *) помещает объект в список, а drain() их все free'ит. Можно еще деструктор передавать в autofree().

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

Проблема не в языке, а в головах сишников (или сиплюсников). Нагородят правил, и вместо того чтобы задачи решать, соревнуются кто больше им соответствует. Не соответствуешь — не тру, у нас так не принято, быдлокод, иди на Яву.

anonymous ()

Харбисон С.П. «Язык С с примерами»

x-signal ()
Ответ на: комментарий от Dudraug

Полагаю K&R для ТС - это пройдённый этап, раз уже стандартом интересуется. А эта книжка и есть, можно сказать, стандарт в переводе.

x-signal ()
Ответ на: комментарий от Eddy_Em

А надо бы вызывать malloc + free перед выходом из функции. Могли бы такую фичу в gcc запилить...

Так ведь давно, g++ называется.

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

На хрен мне сдался ваш C++?

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

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

Ну нельзя так просто взять и добавить в С сборщик мусора!

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

Ну нельзя так просто взять и добавить в С сборщик мусора!

Это да, из-за низкоуровневости языка, максимум что можно сделать - консервативный GC. Но конструкторы и деструкторы - это ни в коей мере не GC, и даже не способствуют его реализации.

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

Да, Вы правы, K&R уже освоил. А книжку эту посмотрю. Спасибо.

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