Artem Chuprina r...@ran.pp.ru writes:
Dmitrii Kashin - debian-russian@lists.debian.org @ Tue, 07 Oct 2014
01:45:56 +0400:
DK Оказывается, можно объявлять структуры, не объявляя их поля. Я в
DK шоке. Оказывается, заголовки можно писать вот так:
DK -- my-objects.h --
Dmitrii Kashin - debian-russian@lists.debian.org @ Tue, 07 Oct 2014 10:23:55
+0400:
DK Оказывается, можно объявлять структуры, не объявляя их поля. Я в
DK шоке. Оказывается, заголовки можно писать вот так:
DK -- my-objects.h --
struct my_object;
struct
Artem Chuprina r...@ran.pp.ru writes:
Dmitrii Kashin - debian-russian@lists.debian.org @ Tue, 07 Oct 2014
10:23:55 +0400:
http://www.gnu.org/software/gnu-c-manual/gnu-c-manual.html#Incomplete-Types
DK Спасибо, Артём. Не дочитал, поторопился. =(
DK Кстати, здесь что-то непонятное с
On Tue, 7 Oct 2014, Dmitrii Kashin wrote:
Ну, если Вы это найдёте ещё и у Кернигана-Ритчи, то я совсем со стыда
сгорю, ибо в отличие от gnu-c-manual этих ребят я читал от корки до
корки несколько раз. =)
Kernighan Brian W, Ritchie Dennis M. The ANSI C programming language
second edition
On Tue, 7 Oct 2014, Artem Chuprina wrote:
Хотя в наше время по Кернигану и Ричи учить
C уже не очень хорошо, уж очень там много давно снятых ограничений.
А я все еще рекомендую...
Какие ограничения, вы имеете в виду, если не секрет?
Была старая книга (1-st edition), но потом ведь
yuri.nefe...@gmail.com writes:
On Tue, 7 Oct 2014, Dmitrii Kashin wrote:
Ну, если Вы это найдёте ещё и у Кернигана-Ритчи, то я совсем со стыда
сгорю, ибо в отличие от gnu-c-manual этих ребят я читал от корки до
корки несколько раз. =)
Kernighan Brian W, Ritchie Dennis M. The ANSI C
Dmitrii Kashin - debian-russian@lists.debian.org @ Tue, 07 Oct 2014 11:18:35
+0400:
http://www.gnu.org/software/gnu-c-manual/gnu-c-manual.html#Incomplete-Types
DK Спасибо, Артём. Не дочитал, поторопился. =(
DK Кстати, здесь что-то непонятное с терминологией: You can *define*
On Tue, 7 Oct 2014, Dmitrii Kashin wrote:
Как бы это сказать помягче, что я в очередной раз удивился, потратил
время, открыл книжку, перечитал, и снова ничего не нашёл?
For example, given the declaration of point above,
struct point pt;
defines a variable pt which is a
yuri.nefe...@gmail.com - debian-russian@lists.debian.org @ Tue, 7 Oct 2014
12:29:15 +0400 (MSK):
Хотя в наше время по Кернигану и Ричи учить
C уже не очень хорошо, уж очень там много давно снятых ограничений.
y А я все еще рекомендую...
y Какие ограничения, вы имеете в виду, если
yuri.nefe...@gmail.com - debian-russian@lists.debian.org @ Tue, 7 Oct 2014
12:16:35 +0400 (MSK):
y p.s. Вообще-то надо понимать, что декларация (объявление) -
y это всего лишь сообщение компилятору, что такой объект существует.
y Ну сообщили, что структура где-то определена, но
Dmitrii Kashin - debian-russian@lists.debian.org @ Tue, 07 Oct 2014 01:45:56
+0400:
DK Оказывается, можно объявлять структуры, не объявляя их поля. Я в
DK шоке.
Тоже мне, шок. Хочешь шока - скажи
grep -rl 'define *errno' /usr/include
потом залезь в тот файл, где оно определяется (это
yuri.nefe...@gmail.com writes:
On Tue, 7 Oct 2014, Dmitrii Kashin wrote:
Как бы это сказать помягче, что я в очередной раз удивился, потратил
время, открыл книжку, перечитал, и снова ничего не нашёл?
For example, given the declaration of point above,
struct point pt;
Artem Chuprina r...@ran.pp.ru writes:
Dmitrii Kashin - debian-russian@lists.debian.org @ Tue, 07 Oct 2014
01:45:56 +0400:
DK Оказывается, можно объявлять структуры, не объявляя их поля. Я в
DK шоке.
Тоже мне, шок. Хочешь шока - скажи
grep -rl 'define *errno' /usr/include
потом
7 октября 2014 г., 17:04 пользователь Dmitrii Kashin
free...@freehck.ru написал:
Artem Chuprina r...@ran.pp.ru writes:
extern int *__errno_location (void) __THROW __attribute__ ((__const__));
Что это такое? ^^^
__THROW - макрос для плюсов,
On Tue, 7 Oct 2014, Artem Chuprina wrote:
yuri.nefe...@gmail.com - debian-russian@lists.debian.org @ Tue, 7 Oct 2014
12:16:35 +0400 (MSK):
y p.s. Вообще-то надо понимать, что декларация (объявление) -
y это всего лишь сообщение компилятору, что такой объект существует.
y Ну сообщили,
yuri.nefe...@gmail.com - debian-russian@lists.debian.org @ Tue, 7 Oct 2014
14:15:27 +0400 (MSK):
y p.s. Вообще-то надо понимать, что декларация (объявление) -
y это всего лишь сообщение компилятору, что такой объект существует.
y Ну сообщили, что структура где-то определена, но
Dmitrii Kashin - debian-russian@lists.debian.org @ Tue, 07 Oct 2014 14:04:30
+0400:
DK Оказывается, можно объявлять структуры, не объявляя их поля. Я в
DK шоке.
Тоже мне, шок. Хочешь шока - скажи
grep -rl 'define *errno' /usr/include
потом залезь в тот файл, где оно
yuri.nefe...@gmail.com - debian-russian@lists.debian.org @ Tue, 7 Oct 2014
12:49:03 +0400 (MSK):
Как бы это сказать помягче, что я в очередной раз удивился, потратил
время, открыл книжку, перечитал, и снова ничего не нашёл?
y For example, given the declaration of point above,
y
yuri.nefe...@gmail.com - debian-russian@lists.debian.org @ Tue, 7 Oct 2014
14:15:27 +0400 (MSK):
y Ну да, не такой умный, но _это_ я понимаю.)
y В этом контексте слово структура совсем не важно.
y Указатель он и в Африке указатель.
Слово структура - это единственный способ в C сделать
On Tue, 07 Oct 2014 14:22:54 +0400
Artem Chuprina r...@ran.pp.ru wrote:
Надо сказать, что мне в моей довольно богатой программистской практике
ни разу не пришлось воспользоваться функцией с аргументом типа массив...
int
utimes(const char *path, const struct timeval times[2]);
:)
--
Artem Chuprina r...@ran.pp.ru writes:
Dmitrii Kashin - debian-russian@lists.debian.org @ Tue, 07 Oct 2014
14:04:30 +0400:
DK Да, кстати, я уже давно хотел кому-нибудь признаться, что со чтением
DK библиотек stl у меня есть некоторые проблемы. Вот например:
Это, кстати, никаким боком не
On Tue, 7 Oct 2014, Dmitrii Kashin wrote:
Фишка в том, что можно написать в заголовке:
-- point.h --
struct point;
struct point* point_constructor();
int point2number(struct point* p);
-
А, понял. Это называется предварительное объявление
Alexander Galanin - debian-russian@lists.debian.org @ Tue, 7 Oct 2014
14:38:19 +0400:
Надо сказать, что мне в моей довольно богатой программистской практике
ни разу не пришлось воспользоваться функцией с аргументом типа массив...
AG int
AG utimes(const char *path, const struct timeval
On Tue, 7 Oct 2014, Artem Chuprina wrote:
yuri.nefe...@gmail.com - debian-russian@lists.debian.org @ Tue, 7 Oct 2014
14:15:27 +0400 (MSK):
y В этом случае нельзя передавать массивы:
y void f(struct S a[]) == void f(struct S* a)
y так как sizeof(struct S) может поменяться.
y Даже без
7 октября 2014 г., 18:45 пользователь yuri.nefe...@gmail.com написал:
А вот если sizeof будет вызываться во время выполнения,
Не бывает.
yuri.nefe...@gmail.com - debian-russian@lists.debian.org @ Tue, 7 Oct 2014
15:16:13 +0400 (MSK):
Фишка в том, что можно написать в заголовке:
-- point.h --
struct point;
struct point* point_constructor();
int point2number(struct point* p);
yuri.nefe...@gmail.com writes:
В С нет разницы между void f(struct S a[]) и void f(struct S *a)
- компилятору это всё равно.
Моё беспокойство было, как будет обрабатываться a[i] или, что то же
самое *(a+i). Как компилятор предотвратит использование такой
конструкции?
Если Вы хотите
On Tue, 7 Oct 2014, dm.fedorov wrote:
7 октября 2014 г., 18:45 пользователь yuri.nefe...@gmail.com написал:
А вот если sizeof будет вызываться во время выполнения,
Не бывает.
Я бы не был бы так уверен )
#include stdio.h
void print_size(int n){
printf(
yuri.nefe...@gmail.com - debian-russian@lists.debian.org @ Tue, 7 Oct 2014
15:45:51 +0400 (MSK):
y В этом случае нельзя передавать массивы:
y void f(struct S a[]) == void f(struct S* a)
y так как sizeof(struct S) может поменяться.
y Даже без обращения к полям.
Да, но из
yuri.nefe...@gmail.com writes:
On Tue, 7 Oct 2014, dm.fedorov wrote:
7 октября 2014 г., 18:45 пользователь yuri.nefe...@gmail.com написал:
А вот если sizeof будет вызываться во время выполнения,
Не бывает.
Я бы не был бы так уверен )
...
printf( sizeof(int[%i])=
AC == Artem Chuprina r...@ran.pp.ru writes:
[…]
AC Называется этот прием непрозрачный указатель (opaque pointer),
AC иногда говорят непрозрачная структура (opaque structure) и
AC используется в хвост и в гриву, начиная с libc (FILE *).
Зависит. Вот, к примеру, в [1] находим:
Ivan Shmakov - debian-russian@lists.debian.org @ Tue, 07 Oct 2014 12:47:49
+:
AC Называется этот прием непрозрачный указатель (opaque pointer),
AC иногда говорят непрозрачная структура (opaque structure) и
AC используется в хвост и в гриву, начиная с libc (FILE *).
ISЗависит. Вот,
Коллеги, sizeof вычисляется во время компиляции. Всегда.Денис 07.10.2014, 17:45, "Artem Chuprina" r...@ran.pp.ru:Ivan Shmakov - debian-russian@lists.debian.org @ Tue, 07 Oct 2014 12:47:49 +: AC Называется этот прием "непрозрачный указатель" (opaque pointer), AC иногда говорят "непрозрачная
Коллеги, sizeof вычисляется во время компиляции. Всегда.Денис 07.10.2014, 17:45, "Artem Chuprina" r...@ran.pp.ru:Ivan Shmakov - debian-russian@lists.debian.org @ Tue, 07 Oct 2014 12:47:49 +: AC Называется этот прием "непрозрачный указатель" (opaque pointer), AC иногда говорят "непрозрачная
On Tue, 7 Oct 2014, Artem Chuprina wrote:
y В С нет разницы между void f(struct S a[]) и void f(struct S *a)
y - компилятору это всё равно.
y Моё беспокойство было, как будет обрабатываться a[i] или, что то же
y самое *(a+i). Как компилятор предотвратит использование такой
y конструкции?
On Tue, 7 Oct 2014, Денис Ильин wrote:
Коллеги, sizeof вычисляется во время компиляции. Всегда.
Денис
Почему? В любом компиляторе?
Факт состоит в том, что стандарт языка С не определяет
этого = это просто практические наблюдения.
Ю.
yuri.nefe...@gmail.com writes:
On Tue, 7 Oct 2014, Artem Chuprina wrote:
y В С нет разницы между void f(struct S a[]) и void f(struct S *a)
y - компилятору это всё равно.
y Моё беспокойство было, как будет обрабатываться a[i] или, что то же
y самое *(a+i). Как компилятор предотвратит
yuri.nefe...@gmail.com writes:
On Tue, 7 Oct 2014, Денис Ильин wrote:
Коллеги, sizeof вычисляется во время компиляции. Всегда.
Денис
Почему? В любом компиляторе?
Ну, как тебе сказать... Эта штука принимает в качестве параметра
_тип_. Поскольку с символами язык Си работать не умеет,
On Tue, 7 Oct 2014, Dmitrii Kashin wrote:
yuri.nefe...@gmail.com writes:
On Tue, 7 Oct 2014, dm.fedorov wrote:
7 октября 2014 г., 18:45 пользователь yuri.nefe...@gmail.com написал:
А вот если sizeof будет вызываться во время выполнения,
Не бывает.
Я бы не был бы так уверен )
...
On Tue, 7 Oct 2014, Dmitrii Kashin wrote:
yuri.nefe...@gmail.com writes:
Тогда похоже, что между указателями на incomplete type и void*
вообще нет никакой разницы. Тем более что и преобразования
типа void* - struct* будут выполнятся молча, даже без
предупреждений. Просто это «сахар» для
Денис Ильин - Artem Chuprina @ Tue, 07 Oct 2014 18:01:30 +0400:
ДИ Коллеги, sizeof вычисляется во время компиляции. Всегда.
Коллега, а никак нельзя сделать так, чтобы Ваши письма НЕ приходили
1) в ответ на то письмо, к которому они не относятся (хотя и относятся к той же
теме дискуссии);
yuri.nefe...@gmail.com - debian-russian@lists.debian.org @ Tue, 7 Oct 2014
18:16:32 +0400 (MSK):
y В С нет разницы между void f(struct S a[]) и void f(struct S *a)
y - компилятору это всё равно.
y Моё беспокойство было, как будет обрабатываться a[i] или, что то же
y самое *(a+i).
On Tue, 7 Oct 2014, Dmitrii Kashin wrote:
yuri.nefe...@gmail.com writes:
On Tue, 7 Oct 2014, Денис Ильин wrote:
Коллеги, sizeof вычисляется во время компиляции. Всегда.
Денис
Почему? В любом компиляторе?
Ну, как тебе сказать... Эта штука принимает в качестве параметра
_тип_.
AC == Artem Chuprina r...@ran.pp.ru writes:
Ivan Shmakov - debian-russian@lists.debian.org:
[…]
IS Что как бы намекает на то, что FILE отнюдь не opaque.
AC Как минимум, используется он как opaque. Хотя на практике он,
AC скорее всего, тоже уже устоялся, не менялся дцать лет, и может быть
On Tue, 07 Oct 2014 15:37:42 +0400
Artem Chuprina r...@ran.pp.ru wrote:
предыдущая из того же мана, struct utimbuf, выглядит стремновато... (Я
так понимаю, с ней идея та же - ее надо создать и заполнить снаружи
библиотеки.) Входящий в нее time_t имеет весьма неплохие шансы внезапно
вырасти
Ivan Shmakov - debian-russian@lists.debian.org @ Tue, 07 Oct 2014 17:15:44
+:
IS Что как бы намекает на то, что FILE отнюдь не opaque.
AC Как минимум, используется он как opaque. Хотя на практике он,
AC скорее всего, тоже уже устоялся, не менялся дцать лет, и может быть
AC доступен
yuri.nefe...@gmail.com - debian-russian@lists.debian.org @ Tue, 7 Oct 2014
21:13:08 +0400 (MSK):
Коллеги, sizeof вычисляется во время компиляции. Всегда.
Денис
Почему? В любом компиляторе?
Ну, как тебе сказать... Эта штука принимает в качестве параметра
_тип_. Поскольку с
On Tue, 7 Oct 2014, Artem Chuprina wrote:
yuri.nefe...@gmail.com - debian-russian@lists.debian.org @ Tue, 7 Oct 2014
18:16:32 +0400 (MSK):
y В С нет разницы между void f(struct S a[]) и void f(struct S *a)
y - компилятору это всё равно.
y Моё беспокойство было, как будет
On Tue, 7 Oct 2014, Artem Chuprina wrote:
y Что-то я вас не понимаю (с).
y Сами же написали: «sizeof(int[n]) преобразуется в нечто
y вроде n*sizeof(int)». Это n* и выполняется в run time.
n* - да, а sizeof - нет. С чем ты споришь?
Еще раз:
int temp[n];
sizeof(temp);
Alexander Galanin - debian-russian@lists.debian.org @ Tue, 7 Oct 2014
21:31:33 +0400:
предыдущая из того же мана, struct utimbuf, выглядит стремновато... (Я
так понимаю, с ней идея та же - ее надо создать и заполнить снаружи
библиотеки.) Входящий в нее time_t имеет весьма неплохие шансы
On Tue, 7 Oct 2014, Ivan Shmakov wrote:
Смысл в том, что «непрозрачные указатели» C плохо совмещаются с
такими средствами языка, как inline и #define.
Вроде бы для inline должно все работать при правильном описании [1].
При вызова из другого файла будет работать как обычная
Alexander Galanin a...@galanin.nnov.ru writes:
[…]
Что же до _t-типов, я недавно натыкался на линковку с двумя
библиотеками, у которых различается FILE_OFFSET_BITS. Потому size_t
были разного размера.
Что-то я не пойму, — какое отношение FILE_OFFSET_BITS имеет
именно к
AC == Artem Chuprina r...@ran.pp.ru writes:
Ivan Shmakov - debian-russian@lists.debian.org:
[…]
AC Но тем не менее, в _API_ libc определения FILE нет.
IS Да, но это свойство документации, — не языка.
AC Не библиотеки, скажем так. Это, гм, намек: если вы раскопали в
AC хедерах
yuri.nefe...@gmail.com - debian-russian@lists.debian.org @ Tue, 7 Oct 2014
22:14:17 +0400 (MSK):
y Возвращаясь же к примеру, мое предложение было написать что-то типа
ytypedef void* struct_S_ptr;
y и вызывать
yf((struct_S_ptr)0);
y И предупреждений не будет и читаемость
yuri.nefe...@gmail.com - debian-russian@lists.debian.org @ Tue, 7 Oct 2014
22:24:02 +0400 (MSK):
y Что-то я вас не понимаю (с).
y Сами же написали: «sizeof(int[n]) преобразуется в нечто
y вроде n*sizeof(int)». Это n* и выполняется в run time.
n* - да, а sizeof - нет. С чем ты
yuri.nefe...@gmail.com - debian-russian@lists.debian.org @ Tue, 7 Oct 2014
23:03:24 +0400 (MSK):
Смысл в том, что «непрозрачные указатели» C плохо совмещаются с
такими средствами языка, как inline и #define.
y Вроде бы для inline должно все работать при правильном описании [1].
Ivan Shmakov - debian-russian@lists.debian.org @ Tue, 07 Oct 2014 19:05:53
+:
IS Недокументированные типы, функции, переменные, etc. — возможны
IS совершенно в любой среде программирования. В отличие от
IS «непрозрачных».
AC Начнем с того, что функции, типы и переменные, как
AC
On Tue, 7 Oct 2014, Artem Chuprina wrote:
yuri.nefe...@gmail.com - debian-russian@lists.debian.org @ Tue, 7 Oct 2014
22:14:17 +0400 (MSK):
y Возвращаясь же к примеру, мое предложение было написать что-то типа
ytypedef void* struct_S_ptr;
y и вызывать
yf((struct_S_ptr)0);
y И
On Wed, 8 Oct 2014, Artem Chuprina wrote:
Впрочем, по сути это тот же самый хак, который позволяет
void f (int n) {
something var[n];
}
Почему же хак? Variable length array входят в стандарт С99.
Ю.
59 matches
Mail list logo