Почему не может gcc находить случайное () интерфейсом, когда-std=c99 установлен?

Я думаю, это просто, вы можете проверить с помощью min (Id) и Max (id) с левым внешним соединением или внешним применением

подобно

Declare @ItemID int = 2
Select * From @OderDetail A
Outer Apply (
    Select MIN(A2.Id) minID, MAX(A2.Id) maxID From @OderDetail A2
    Where A2.ItemId =@ItemID
) I05
Outer Apply(
    Select * From @OderDetail Where Id=minID-1
    Union All
    Select * From @OderDetail Where Id=maxID+1
    ) I052
Where A.ItemId =@ItemID Order By A.Id

. Дайте мне знать, если это поможет у вас или у вас есть какие-либо проблемы с этим ...

Привет,

18
задан Deduplicator 13 October 2015 в 19:24
поделиться

4 ответа

man srandom говорит, что функция не часть C99, но часть POSIX.

Активируются _BSD_SOURCE или _XOPEN_SOURCE >= 500, или любая другая подходящая функция тестируют макрос, который объявляет функцию srandom/random (см. man feature_test_macros и man srandom).

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

/usr/bin/colorgcc -std=c99 -D_XOPEN_SOURCE=600 -fgnu89-inline -g -Wall 
    -I/usr/include -I./ -I../ -I../../ -I../../../ -I../../../../ -O3 -o f8  f8.c
15
ответ дан 30 November 2019 в 08:27
поделиться

Я использую рэнд () и srand (). BTW: Вы забывали заголовок или два? По крайней мере, второе предупреждение говорит мне так.

Попытка включая math.h. (Просто помнивший мы всегда имели проблемы с математической библиотекой и должны были на самом деле вызвать, связывают его с-lm).

-1
ответ дан 30 November 2019 в 08:27
поделиться

Да, это уловка. отсутствует: вы можете использовать -std = gnu99 вместо -std = c99 .

-std = c99 #define s __ STRICT_ANSI __ , что /usr/include/features.h интерпретируется как «по умолчанию не разрешать ничего, выходящее за рамки стандарта C» (без него вы получите как минимум _SVID_SOURCE и _BSD_SOURCE ). -std = gnu99 , с другой стороны, означает «C99 плюс расширения GNU» (по умолчанию gcc в настоящее время -std = gnu89 , его эквивалент C89, поэтому вам нужно укажите что-нибудь, чтобы получить новые функции C99).

В качестве альтернативы вы можете включить макросы тестирования функций (как указано в ответе @ litb). Глядя на /usr/include/stdlib.h в моей системе, он ожидает одно из __ USE_SVID , __ USE_XOPEN_EXTENDED или __ USE_SVID или __. /usr/include/features.h сообщает мне, что макросы тестирования функций, которые могут их включить:

  • _SVID_SOURCE (включает __ USE_SVID )
  • _BSD_SOURCE (включает __ USE_BSD )
  • _XOPEN_SOURCE как минимум [1150855] [1150855] [1150855] 500 (включает __ USE_XOPEN_EXTENDED )
  • _XOPEN_SOURCE_EXTENDED (также включает __ USE_XOPEN_EXTENDED )
  • _GNU567, включая все макросы, включает все макросы )

Для новых программ, в которых вас не слишком беспокоят потенциальные конфликты имен с новыми функциями из будущих стандартов, хорошей идеей будет использование -std = gnu99 и -D_GNU_SOURCE . Он позволяет вам использовать все новые стандартные функции и расширения GNU в сочетании с каким-то запасным вариантом (например, autoconf -style feature tests) дает наибольшую гибкость.

Ссылки:

12
ответ дан 30 November 2019 в 08:27
поделиться

Я создал случайные числа, используя GCC в CodeBlocks под Ubuntu 9.10 (с опциями компилятора: -Std = GNU99 -D_GNU_Source ) Так что это сработало для меня:

Это мой код, который я играл С:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
enum computer {keyboard, CPU, screen, printer};
int main(void)
{
  enum computer comp;
  time_t casovac;
  comp = CPU;
  srand(&casovac);
  printf("%d", rand());
  return 0;
}

Это была только идея, конечно, вы сможете выполнить его по другим способам ;-) [Установить CodeBlocks Использование: Sudo APT-Get Установить настроек , а затем Sudo Получить установку CodeBlocks ]

0
ответ дан 30 November 2019 в 08:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: