LINUX.ORG.RU

Непонятки с Си.


0

0

На си не писал уже фиг знает скока, всё больше плюсы и т.п.

так вот понадобилось на работе написать небольшой обработчик логов на Си. Запись в файл делал через write(), поскольку Си я подзабыл порядочно, то вызвал чтото типо write(int file_descriptor, const void *buf) - забыв указать размерность строки(третий параметр). gcc даже варнинга на это не написал - это нормально?

PS В файле естественно оказалась какаято фигня.

> забыв указать размерность строки(третий параметр). gcc даже варнинга на это не написал - это нормально?

При implicit declaration отключилась проверка типов и количества переданных аргументов?

Sphinx ★★☆☆
()

если ты инклудил хедер, то должен был дать варнинг о несовпадении сигнатуры.

если ты не инклудил хедер, то он должен был выдать варнинг о implicit declaration

если же ты сам написал декларацию для write то ты ссзб

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

>если ты инклудил хедер, то должен был дать варнинг о несовпадении сигнатуры.

Я инклудил хедер, но варнинга небыло. GCC 4.1 по моему - тот что в федоре 6.

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

$ cat ttt.c
#include <unistd.h>

int main()
{
    write(0, 0);
    return 0;
}

$ gcc ttt.c
ttt.c: In function 'main':
ttt.c:5: error: too few arguments to function 'write'

$ gcc -v
Using built-in specs.
Target: i686-pc-linux-gnu
Configured with: /var/tmp/portage/gcc-4.1.1/work/gcc-4.1.1/configure --prefix=/usr --bindir=/usr/i686-pc-linux-gnu/gcc-bin/4.1.1 --includedir=/usr/lib/gcc/i686-pc-linux-gnu/4.1.1/include --datadir=/usr/share/gcc-data/i686-pc-linux-gnu/4.1.1 --mandir=/usr/share/gcc-data/i686-pc-linux-gnu/4.1.1/man --infodir=/usr/share/gcc-data/i686-pc-linux-gnu/4.1.1/info --with-gxx-include-dir=/usr/lib/gcc/i686-pc-linux-gnu/4.1.1/include/g++-v4 --host=i686-pc-linux-gnu --build=i686-pc-linux-gnu --disable-altivec --enable-nls --without-included-gettext --with-system-zlib --disable-checking --disable-werror --disable-libunwind-exceptions --disable-multilib --disable-libmudflap --disable-libssp --disable-libgcj --enable-languages=c,c++,fortran --enable-shared --enable-threads=posix --enable-__cxa_atexit --enable-clocale=gnu
Thread model: posix
gcc version 4.1.1 (Gentoo 4.1.1)

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

Походу ты гонишь мил-человек. Наверняка ты  не включил unistd.h.

$ cat test1.c
#include <unistd.h>

main()
{
    char *p = "Test\n";
    write(1, p);
    return 0;
}

$ gcc -o test1 test1.c
test1.c: In function ‘main’:
test1.c:6: error: too few arguments to function ‘write’
$ gcc --version
gcc (GCC) 4.2.1 (Debian 4.2.1-3)
Copyright (C) 2007 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

anonymous
()

Для обработки логов надо юзать что-нибудь типа awk/sed/perl/python. Jedem das Seine.

anonymous
()

Действительно, без подключению unistd.h gсс не ругается на 2 аргумента, но и пишет неизвестно что неизвестно как, хотя понятно куда =) При подключении unistd - получаем ошибку и не получаем бинарник =)

Вывод - проверьте ещё разок вниметельнее - заголовочный файл очевидно не подключен.

teferiincub
()

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

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

>вроде как Си не требует указания прототипов функций вообще!

очень очень интересно, на чём значит вы любите программировать?

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

>Для обработки логов надо юзать что-нибудь типа awk/sed/perl/python. Jedem das Seine.

я бы с удовольствием, но начальство хочет Си :(

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

>я бы с удовольствием, но начальство хочет Си :(

пусть само пишет ж))

а вообще Lua на C написан и внедрить его в код не сложно ж))

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

> очень очень интересно, на чём значит вы любите программировать?

K&R C

anonymous
()

Напишите свою прогу портабельнее - юзайте <stdio.h> :)

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