Subject: Re: Компиляция Refal6 для Linu
dmsidorov@mtu-net.ru
Date: Sun Oct 28 2001 - 00:26:37 MSD
On Fri, Oct 26, 2001 at 08:28:50PM +0400, Arkady Klimov wrote:
> Здравствуйте, Дмитрий,
> с указанной Вами ошибкой я в некоторой растерянности. (На С
> я уже более 5 лет не работаю). Почему-то до сих пор ни один
> компилятор в этом месте не брыкался. Что сие означает? Верно
> ли, что по стандарту языка правая часть инициализатора обязана
> быть константой? И почему stderr - не константа? 
Здравствуйте, Аркадий.
Мои познания в C++ весьма невелики, как инженер всегда старался 
использовать Паскаль или что-нибудь скриптовое, но вот что написано 
в FAQ к gcc2.95:
Why can't I initialize a static variable with stdin?
   This has nothing to do with gcc, but people ask us about it a lot. 
   Code like this:
   #include <stdio.h>
   FILE *yyin = stdin;
   will not compile with GNU libc (Linux libc6), because stdin is not a 
   constant. This was done deliberately, in order for there to be no 
   limit on the number of open FILE objects. It is surprising for people 
   used to traditional Unix C libraries, but it is permitted by the C 
   standard.
Так что, получается, под Linux это будет считаться ошибкой как минимум 
до выхода новой glibc, а может, и дальше.
Кроме того, glibc теперь включает в себя определения myulong и myushort 
(заголовок <sys/types.h>, включаемый через <stdlib.h>), полностью 
идентичные тем, что в исходниках Рефала, поэтому ошибки не возникает, 
но выдаются предупреждения об их переопределении. Чтобы избежать 
двойного определения, возможно, следует использовать препроцессорную 
директиву вроде
#if __GLIBC__ >= 2
но я пока не смотрел, начиная с какой версии это появилось.
> В принципе, можно, наверно, поступить и так:
> 
> 1.удалить эту строку 43 rfstor.h
> 
> 2.заменить строку 40 rfstor.h на строку:
> EXT FILE *    stdtrc;           /* File for debug information       */
> (было:
> extern FILE *    stdtrc;           /* File for debug information       */
> )
> 
> 3. Вставить инициализацию
>     stdtrc = stderr;
> первым оператором в функцию initstor (файл rfstor.c, строка 256)
> (эта функция вызывается первой в функции main).
Этот способ сработал, после исправлений rfstor.c скомпилировался 
нормально. Теперь остались нескомпилированы rfarm.c и rbarm.c. 
В rbarm.c строка 252 содержит определение matherr, конфликтующее с 
аналогичным в <math.h>:
# ifdef __cplusplus
extern int matherr __P ((struct __exception *__exc));
# else
extern int matherr __P ((struct exception *__exc));
# endif
Сообщение об ошибке в rfarm.c совершенно непонятно:
rfarm.c: In function `rf_cgetnumb':
rfarm.c:289: Unable to generate reloads for:
(insn 45 43 47 (parallel[
            (set (reg:SI 0 %eax)
                (fix:SI (fix:SF (reg/v:SF 0 %eax))))
            (clobber (mem:HI (plus:SI (reg:SI 6 %ebp)
                        (const_int -2 [0xfffffffe])) 0))
            (clobber (mem:HI (plus:SI (reg:SI 6 %ebp)
                        (const_int -4 [0xfffffffc])) 0))
            (clobber (mem:SI (plus:SI (reg:SI 6 %ebp)
                        (const_int -8 [0xfffffff8])) 0))
            (clobber (scratch:HI))
        ] ) 145 {fix_truncsfsi2+1} (insn_list 92 (nil))
    (expr_list:REG_EQUIV (mem:SI (reg/v:SI 3 %ebx) 0)
        (expr_list:REG_DEAD (reg/v:SF 0 %eax)
            (expr_list:REG_UNUSED (scratch:HI)
                (nil)))))
make: *** [rfarm.o] Error 1
Что делать с определением matherr в rbarm.c, я еще мог бы попробовать 
докопаться, но насчет rfarm.c никаких идей нет. Я еще не подписан, поэтому, 
если есть что подсказать, пишите не только в рассылку, но и на мой адрес.
С уважением, Дмитрий.
> | ----- Original Message -----
> | From: dmsidorov@mtu-net.ru
> | To: klimov@keldysh.ru
> | сожалению, компиляция завершилась неудачей со следующим сообщением
> | об ошибке:
> |
> | gcc rfstor.c -O -c -ggdb
> | In file included from refcom.h:55,
> |                  from refgen.h:16,
> |                  from refint.h:14,
> |                  from rfstor.c:6:
> | rfstor.h:43: initializer element is not constant
This archive was generated by hypermail 2b25 : Mon Oct 25 2004 - 21:24:59 MSD