URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 9262
[ Назад ]

Исходное сообщение
"Аспекты работы gcc -std=c99"

Отправлено VSlater , 21-Окт-11 15:41 
Доброго времени суток, уважаемые. Буду краток.

$ uname -a
Linux lh-ABC512 2.6.35-29-generic #51-Ubuntu SMP Fri Apr 15 17:12:35 UTC 2011 x86_64 GNU/Linux
$ cat -n fifo.c
     1    #include <stdio.h>
     2    #include <stdlib.h>
     3    #include <string.h>
     4    #include <linux/stat.h>
     5    #include <sys/types.h>
     6    #include <sys/stat.h>
     7    #include <fcntl.h>
     8    #include <unistd.h>
     9    #include <errno.h>
    10    
    11    #define FIFO_FILE       "MYFIFO"
    12    
    13    int main(void)
    14    {
    15        FILE *fp;
    16        char readbuf[80];
    17    
    18        umask(0);
    19        mknod(FIFO_FILE, S_IFIFO|0666, 0);
    20        while(1) {
    21            fp = fopen(FIFO_FILE, "r");
    22            fgets(readbuf, 80, fp);
    23            printf("Received string: %s\n", readbuf);
    24            fclose(fp);
    25        }
    26        return(0);
    27    }
$ gcc -v
Using built-in specs.
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.4.4-14ubuntu5' --with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.4 --enable-shared --enable-multiarch --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.4 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --disable-werror --with-arch-32=i686 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.4.5 (Ubuntu/Linaro 4.4.4-14ubuntu5)
$
$ gcc -std=c99  -Wall  ./fifo.c  -o  ./fifo
./fifo.c: In function ‘main’:
./fifo.c:19: warning: implicit declaration of function ‘mknod’
./fifo.c:19: error: ‘S_IFIFO’ undeclared (first use in this function)
./fifo.c:19: error: (Each undeclared identifier is reported only once
./fifo.c:19: error: for each function it appears in.)
$
$ gcc -Wall ./fifo.c  -o ./fifo
$
$ gcc-4.5 -v
Using built-in specs.
COLLECT_GCC=gcc-4.5
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.5.1/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.5.1-7ubuntu2' --with-bugurl=file:///usr/share/doc/gcc-4.5/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.5 --enable-shared --enable-multiarch --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.5 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-plugin --enable-gold --with-plugin-ld=ld.gold --enable-objc-gc --disable-werror --with-arch-32=i686 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.5.1 (Ubuntu/Linaro 4.5.1-7ubuntu2)
$
$ gcc-4.5  -std=c99  -Wall  ./fifo.c  -o  ./fifo
./fifo.c: In function ‘main’:
./fifo.c:19:2: warning: implicit declaration of function ‘mknod’
./fifo.c:19:19: error: ‘S_IFIFO’ undeclared (first use in this function)
./fifo.c:19:19: note: each undeclared identifier is reported only once for each function it appears in
$
$ gcc-4.5  -Wall  ./fifo.c  -o  ./fifo
$

Все пути и хидеры корректны.
Вопрос: Почему с '-std=c99' такой результат?


Содержание

Сообщения в этом обсуждении
"Аспекты работы gcc -std=c99"
Отправлено anonymous , 21-Окт-11 19:02 
Из-за XSI наверное.

http://pubs.opengroup.org/onlinepubs/009695399/functions/mkn...
http://pubs.opengroup.org/onlinepubs/009695399/basedefs/sys/...


"Аспекты работы gcc -std=c99"
Отправлено Вова , 22-Окт-11 02:53 
Если вопрос стоит ребром, то стоит парсить вывод gcc -E,  разницу сгенерированных исходников.  

"Аспекты работы gcc -std=c99"
Отправлено VSlater , 22-Окт-11 15:23 
> Если вопрос стоит ребром, то стоит парсить вывод gcc -E,  разницу
> сгенерированных исходников.

diff.txt (gcc-4.5 -std=c99 & gcc-4.5)
<  mknod("MYFIFO", S_IFIFO|0666, 0);
---
>  mknod("MYFIFO", 0010000|0666, 0);

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
/usr/include/sys/stat.h

#if defined __USE_BSD || defined __USE_MISC || defined __USE_XOPEN
# define S_IFMT         __S_IFMT
# define S_IFDIR        __S_IFDIR
# define S_IFCHR        __S_IFCHR
# define S_IFBLK        __S_IFBLK
# define S_IFREG        __S_IFREG
# ifdef __S_IFIFO
#  define S_IFIFO       __S_IFIFO
# endif
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
gcc-4.5 -E

gcc-4.5:
# 323 "/usr/include/sys/stat.h" 3 4
extern int mknod (__const char *__path, __mode_t __mode, __dev_t __dev)
     __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1)));
extern int mknodat (int __fd, __const char *__path, __mode_t __mode,
      __dev_t __dev) __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (2)));

# 444 "/usr/include/sys/stat.h" 3 4
extern int __xmknod (int __ver, __const char *__path, __mode_t __mode,
       __dev_t *__dev) __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (2, 4)));
extern int __xmknodat (int __ver, int __fd, __const char *__path,
         __mode_t __mode, __dev_t *__dev)
     __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (3, 5)));

gcc-4.5 -std=c99:
# 444 "/usr/include/sys/stat.h" 3 4
extern int __xmknod (int __ver, __const char *__path, __mode_t __mode,
       __dev_t *__dev) __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (2, 4)));

extern int __xmknodat (int __ver, int __fd, __const char *__path,
         __mode_t __mode, __dev_t *__dev)
     __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (3, 5)));
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
/usr/include/sys/stat.h

/* Create a device file named PATH, with permission and special bits MODE
   and device number DEV (which can be constructed from major and minor
   device numbers with the `makedev' macro above).  */
#if defined __USE_MISC || defined __USE_BSD || defined __USE_XOPEN_EXTENDED
extern int mknod (__const char *__path, __mode_t __mode, __dev_t __dev)
     __THROW __nonnull ((1));

# ifdef __USE_ATFILE
/* Like mknod, create a new device file with permission bits MODE and
   device number DEV.  But interpret relative PATH names relative to
   the directory associated with FD.  */
extern int mknodat (int __fd, __const char *__path, __mode_t __mode,
                    __dev_t __dev) __THROW __nonnull ((2));
# endif
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
/usr/include/features.c
/*
    __USE_MISC             Define things common to BSD and System V Unix.
    __USE_BSD              Define 4.3BSD things.
    __USE_XOPEN_EXTENDED   Define X/Open Unix things
*/
//...
#if defined _BSD_SOURCE || defined _SVID_SOURCE
# define __USE_MISC     1
#endif
/...
/*
    _SVID_SOURCE         ISO C, POSIX, and SVID things.
*/
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
$ cat -n def.c
     1    
     2    #include <stdio.h>
     3    #include <linux/stat.h>
     4    #include <sys/types.h>
     5    #include <sys/stat.h>
     6    #include <fcntl.h>
     7    
     8    int main(void)
     9    {
    10    
    11    #if defined  __USE_MISC || defined __USE_BSD || defined __USE_XOPEN_EXTENDED || \
    12      defined  _SVID_SOURCE  || defined  __USE_MISC || defined __USE_XOPEN
    13            printf("Defined\n");
    14    #endif
    15            return 0;
    16    }
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
$ gcc-4.5 -std=c99 -Wall ./def.c -o ./def
$ ./def
$
$ gcc-4.5 -Wall ./def.c -o ./def
$ ./def
Defined
$
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Есть предположения что gcc-4.5 -std=c99 _как-то_по_особенному_
сконфигурирован для данного дистрибутива либо я чего-то не понял.


"Аспекты работы gcc -std=c99"
Отправлено Вова , 22-Окт-11 22:57 

> //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> Есть предположения что gcc-4.5 -std=c99 _как-то_по_особенному_
> сконфигурирован для данного дистрибутива либо я чего-то не понял.

  Результат препроцессинга различный, значит далее надо смотреть выводы gcc -M -dM: изучать разницу в наборе макросов и списка использованных заголовочных файлов. Находим, что в случае -std-c99 нет переопределения S_IFIFO в __S_IFIFO, находим, в каком из выданного списка использованных заголовочных файлов он был определён, и видим, что не хватает тройки макросов __бсд, __хопен, __миск. Смотрим разницу исходных наборов макросов через gcc -dM hello.c с пустым  main() без заголовочных файлов, видим определение __STRICT_ANSI__, которое опять грепаем в том же списке использованных заголовочных файлов, находим feautures.h с подробными каментами. То есть, либо грубо неопределяем undef __STRICT_ANSI__ перед stdio.h, либо наоборот, определяем какой-либо из __бсд/__миск/__хопен перед включением stat.h.


"Аспекты работы gcc -std=c99"
Отправлено VSlater , 23-Окт-11 14:32 
Переопределить — не вопрос.
Вопрос — как это аукнется на остальных фрагментах кода.
Есть основания полагать, что ментейнер(ы) gcc в Ubuntu,
наверняка чем-то руководствовались, когда принимали решения о такой конфигурации gcc.


В итого: в мануале gcc-4.5 нашёл
gnu99
GNU dialect of ISO C99.  
When ISO C99 is fully implemented in GCC, this will become the default.

$ gcc-4.5 -std=gnu99 -Wall ./fifo.c -o ./fifo
$

Попробую пересобрать весь проект с -std=gnu99.
Если появятся 'внезапности' — новый пост.

Благодарю за подсказки.


"Аспекты работы gcc -std=c99"
Отправлено Вова , 23-Окт-11 14:55 
> Переопределить — не вопрос.
> Вопрос — как это аукнется на остальных фрагментах кода.

В принципе, ничто не мешает использовать __S_IFIFO, ничего не меняя в дефайнах.

> Есть основания полагать, что ментейнер(ы) gcc в Ubuntu,
> наверняка чем-то руководствовались, когда принимали решения о такой конфигурации gcc.

На генте те же резултаты.


> В итого: в мануале gcc-4.5 нашёл
> gnu99
> GNU dialect of ISO C99.
> When ISO C99 is fully implemented in GCC, this will become the
> default.

Он отличается от с99 как раз отсутствием  __STRICT_ANSI__:
gcc hello.c  -std=gnu99  -dM -M >std.gnu99

gcc hello.c  -std=c99  -dM -M >std.c99

diff std.gnu99 std.c99
46a47
> #define __STRICT_ANSI__ 1

69d69
< #define unix 1
86d85
< #define linux 1
112d110
< #define i386 1

Мне интересны цели данной сборки. Розыгрыш коллег с триграфами '??/' ?


"Аспекты работы gcc -std=c99"
Отправлено VSlater , 23-Окт-11 16:01 
> В принципе, ничто не мешает использовать __S_IFIFO, ничего не меняя в дефайнах.

  «GCC unforeseen consequences complete walkthrough».
  Захардкодить оно конечно можно.
  Но на текущий момент времени, нет конкретной информации,
  где НЕ будет собираться этот проект.

> Он отличается от с99 как раз отсутствием  __STRICT_ANSI__

   alias gcc99='gcc-4.5 -std=gnu99 -pedantic-errors -Wall'.

> Розыгрыш коллег с триграфами '??/' ?

  "Я бы этому дяде с большими ушами уши-то пооткрутил."(с)


"Аспекты работы gcc -std=c99"
Отправлено Вова , 23-Окт-11 16:47 
>> Розыгрыш коллег с триграфами '??/' ?
>   "Я бы этому дяде с большими ушами уши-то пооткрутил."(с)

Да, триграфы были созданы для написания комментария
//Why the following line doesn't work??/

мелкомягкий компилятор когда-то их поддерживал молча без предупреждений.


"Аспекты работы gcc -std=c99"
Отправлено anonymous , 23-Окт-11 16:20 
Не стоит лазить в /usr/include и делать какие-то выводы -- везде все по-разному. Лучше читайте стандарты, там все очень просто и доступно.

"Аспекты работы gcc -std=c99"
Отправлено Вова , 23-Окт-11 16:36 
> Не стоит лазить в /usr/include и делать какие-то выводы -- везде все
> по-разному. Лучше читайте стандарты, там все очень просто и доступно.

Да, очень просто, очень доступно, очень идеалистично, очень теоретично.


"Аспекты работы gcc -std=c99"
Отправлено anonymous , 23-Окт-11 16:58 
> Да, очень просто, очень доступно, очень идеалистично, очень теоретично.

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

Стандарт, который в gcc зовется -std=c99, состоит из нескольких частей. Не каждая из этих частей обязана поддерживаться системой, чтобы отвечать этому стандарту. То, с чем вы тут столкнулись, называется XSI. Чтобы его задействовать, надо в самом начале исходника, т.е. перед инклудами, воткнуть #define _XOPEN_SOURCE 600, что просто, доступно, идеалистично и теоретично объяснено в последней ссылке.

Срочно читай IEEE Std 1003.1 много раз до просветления или меняй род занятий, кулхацкер.


"Аспекты работы gcc -std=c99"
Отправлено Вова , 23-Окт-11 20:55 
>[оверквотинг удален]
> Вова, обычно мне кайфолом что-то пересказывать, и я даю ссылки. Пишу это
> только ради будущих поколений, что будут читать этот тред, дабы они
> не велись на твои бредовые загоны.
> Стандарт, который в gcc зовется -std=c99, состоит из нескольких частей. Не каждая
> из этих частей обязана поддерживаться системой, чтобы отвечать этому стандарту. То,
> с чем вы тут столкнулись, называется XSI. Чтобы его задействовать, надо
> в самом начале исходника, т.е. перед инклудами, воткнуть #define _XOPEN_SOURCE 600,
> что просто, доступно, идеалистично и теоретично объяснено в последней ссылке.
> Срочно читай IEEE Std 1003.1 много раз до просветления или меняй род
> занятий, кулхацкер.

Ага, много пафосного текста, и только один момент: где по приведённым ссылкам упоминается стандарт 99?


"Аспекты работы gcc -std=c99"
Отправлено Вова , 23-Окт-11 21:54 
>[оверквотинг удален]
> Вова, обычно мне кайфолом что-то пересказывать, и я даю ссылки. Пишу это
> только ради будущих поколений, что будут читать этот тред, дабы они
> не велись на твои бредовые загоны.
> Стандарт, который в gcc зовется -std=c99, состоит из нескольких частей. Не каждая
> из этих частей обязана поддерживаться системой, чтобы отвечать этому стандарту. То,
> с чем вы тут столкнулись, называется XSI. Чтобы его задействовать, надо
> в самом начале исходника, т.е. перед инклудами, воткнуть #define _XOPEN_SOURCE 600,
> что просто, доступно, идеалистично и теоретично объяснено в последней ссылке.
> Срочно читай IEEE Std 1003.1 много раз до просветления или меняй род
> занятий, кулхацкер.

Скорее это ты тут обнаруживаешь незнание того, что такое XSI. Отвечаю развёрнуто.
mknod не может быть никаким 'XSI extension', как ты предполагал в первом сообщении. Это никакое не расширение апи X/Open System Interface. Мкнод - это и есть юникс, грубо говоря, сколько лет системе - столько и ему!   SuS я читал не однократно, и продолжаю читать, и далеко не первый год, но с потребностью в данном макросе я сталкиваюсь впервые. Но отлично - я погуглил 10 минут, и теперь знаю больше тебя, и более того - знаю, как ты написал своё сообщение.
Где-то ты увидал этот дефайн, обнаружил что он помогает, но как - понять так и не смог. В man 2 mknod от glibc упомянут только лишь как один из вариантов _XOPEN_SOURCE >= 500.
Один из 4 макросов, которые дадут доступ к данному апи в glibc.
а 600 соответствует SuSv3. То есть бейс интерфейс 2001го (включая мкнод) + расширения.
Того же результата можно добиться с _BSD_SOURCE, с _SVID_SOURSE, с  _XOPEN_SOURCE&& _XOPEN_SOURCE_EXTENDED, опять же - в конкретном случае реализации glibc. Никто не гарантирует работоспособность данных макросов при использовании других реализаций libc. Стандарт - это стандарт. Реализация - это реализация. Теория - практика. Мухи и котлеты.


"Аспекты работы gcc -std=c99"
Отправлено anonymous , 24-Окт-11 05:21 
ТС прости, но я хочу это сделать.

> Скорее это ты тут обнаруживаешь незнание того, что такое XSI. Отвечаю развёрнуто.
> mknod не может быть никаким 'XSI extension', как ты предполагал в первом
> сообщении. Это никакое не расширение апи X/Open System Interface. Мкнод -
> это и есть юникс, грубо говоря, сколько лет системе - столько
> и ему!

Молодец, ГТО. Только речь тут о -std=c99, с коим все слегка не так.

> SuS я читал не однократно, и продолжаю
> читать, и далеко не первый год, но с потребностью в данном
> макросе я сталкиваюсь впервые.

Там общей информации чуток, остальная справочная. Чо ты там годами вычитываешь?? )))
Потребность в макросе всегда была (опять же при -std=c99).

> Но отлично - я погуглил 10 минут,
> и теперь знаю больше тебя, и более того - знаю, как
> ты написал своё сообщение.

Без комментариев...

>  Где-то ты увидал этот дефайн, обнаружил что он помогает, но как
> - понять так и не смог.

Этот дефайн, с помощью окружающих #if и #endif, разрешает в инклудах нужные объявления. Или будешь пугать меня магическими дефайнами?

> В man 2 mknod от
> glibc упомянут только лишь как один из вариантов _XOPEN_SOURCE >= 500.
>  Один из 4 макросов, которые дадут доступ к данному апи в
> glibc.
> а 600 соответствует SuSv3. То есть бейс интерфейс 2001го (включая мкнод) +
> расширения.
>  Того же результата можно добиться с _BSD_SOURCE, с _SVID_SOURSE, с  
> _XOPEN_SOURCE&& _XOPEN_SOURCE_EXTENDED, опять же - в конкретном случае реализации glibc.

Первые два--это способ объяснить glibc со товарищи, что эти сорцы писали, мм.. так сказать не совсем с оглядкой на переносимость, а с оглядкой на конкретную систему, прям как ты любишь. Хвала всем богам, различия часто несущественны или отсутствуют, что, например, позволяет компилить нативные бсдовые сорцы без изменений. При чем тут официально стандартизированные интерфейсы? Кстати C99 не включает mknod, угадай почему.

Если ты не заметил, ТС старается ориентироваться не на glibc, а на посикс. С таким подходом ему не придется лопатить сорцы при переходе на другую стандартную библиотеку; главное, чтобы она умела POSIX+XSI.

> Никто не гарантирует работоспособность данных макросов при использовании других реализаций
> libc.

Ага, щас вот кто-нибудь как напииишет такую libc, что она не будет совместима ни с другой libc, ни с существующими сорцами, ни с POSIX, ни с SUS. Боюсь-боюсь.

> Стандарт - это стандарт. Реализация - это реализация. Теория -
> практика. Мухи и котлеты.

Чушь и бред. Пруф в [1]. Там же описано, как mknod относится к C99, достаточно прочитать абзац со словами "File System Interface", перейти по ссылке, потом перейти на "Making Special Files".

Ты правда считаешь, что не стоит делать так, как написано в официальном документе, но вместо этого стоит копаться во внутренностях /usr/include, ища там ошибки, или использовать системные символы, начинающиеся с "__"? Можешь не утруждать себя ответом, мне не особо интересно.

[1] http://www.gnu.org/software/libc/manual/html_node/POSIX.html


"Аспекты работы gcc -std=c99"
Отправлено Вова , 24-Окт-11 09:37 

>>  Где-то ты увидал этот дефайн, обнаружил что он помогает, но как
>> - понять так и не смог.
> Этот дефайн, с помощью окружающих #if и #endif, разрешает в инклудах нужные
> объявления. Или будешь пугать меня магическими дефайнами?

Этот дефайн ты где-то вычитал из сорцов, долго пялился в него, думая, случайно он помог, или "так и надо". Поэтому ты его закопировал посимвольно, с опаской: "наверное XSI", и только сейчас в тебе проснулось красноречие. Данные макросы формируют окружение, то есть фактически говорят, именно в данном случае из man 2 mknod: если не задан ни _BSD_SOURCE, ни _SVID_SOURCE и  при этом твой любимый _XOPEN_SOURCE  < 500  - то данная функция работать не будет. Про портабельность - за 10 лет я работал с двумя компиляторами, под десяток платформ, данный макрос - увы и ах, нет, не использовал, не припоминаю. Ни СанСтудио, ни любая инкарнация гцц его не требует - определяет самостоятельно.


"Аспекты работы gcc -std=c99"
Отправлено arturpub , 24-Окт-11 13:48 
Ладно, ладно, убил.. )) Ты прав, а я нет. Ты крут, а я лох, чмо и мудило.
Уж прости, что начал вякать не по теме )))) Давай закроем ее что-ли.

2ТС: отдельно извиняюсь, проблема-то хоть решилась?


"Аспекты работы gcc -std=c99"
Отправлено VSlater , 25-Окт-11 13:31 
> 2ТС: отдельно извиняюсь, проблема-то хоть решилась?

В итого: Да помогло.
Тему считаю закрытой.

Всем спасибо, все свободны.(с)


"Аспекты работы gcc -std=c99"
Отправлено anonymous , 23-Окт-11 16:11 
По ссылкам tl;dr? Так и быть, держи еще одну.

http://pubs.opengroup.org/onlinepubs/007904975/functions/xsh...


"Аспекты работы gcc -std=c99"
Отправлено VSlater , 23-Окт-11 16:33 
> По ссылкам tl;dr?

1. С таким подходом IT вообще не стоит заниматься.
2. Осиление информации по вашим ссылкам, благодарю за оные, запланированно на сегодняшний вечер.


"Аспекты работы gcc -std=c99"
Отправлено Вова , 23-Окт-11 16:51 
> По ссылкам tl;dr? Так и быть, держи еще одну.
> http://pubs.opengroup.org/onlinepubs/007904975/functions/xsh...

оффтопик