Объявление целочисленного определения типа фиксированного размера в Стандарте C

preg_* функции ожидают Perl совместимые регулярные выражения с разделителями. Так попробуйте это:

preg_replace('/[[:punct:]]/', ' ', $string)

5
задан kbluck 9 October 2009 в 23:35
поделиться

4 ответа

Да , вы можете.

Заголовочный файл limits.h должен быть частью C90. Затем я бы протестировал с помощью директив препроцессора значения SHRT_MAX , INT_MAX , LONG_MAX и LLONG_MAX и соответственно установил typedefs

). :

#include <limits.h>

#if SHRT_MAX == 2147483647
typedef unsigned short int uint32_t;
#elif INT_MAX == 2147483647
typedef unsigned int uint32_t;
#elif LONG_MAX == 2147483647
typedef unsigned long uint32_t ;
#elif LLONG_MAX == 2147483647
typedef unsigned long long uint32_t;
#else
#error "Cannot find 32bit integer."
#endif
8
ответ дан 18 December 2019 в 08:29
поделиться

Нет. Однако есть надежный способ объявить отдельные целочисленные переменные размером до 32 бит, если вы хотите жить с некоторыми ограничениями. Просто используйте длинные битовые поля (последнее гарантированно будет иметь ширину не менее 32 бит, и вам разрешено использовать до такого количества битов в битовых полях, сколько поместится в переменной, если декларатор битового поля был опущен ). Итак:

struct {
   unsigned long foo : 32; 
} bar;

Очевидно, вы получаете все связанные с этим ограничения, такие как невозможность иметь указатели на такие переменные. Единственное, что это действительно дает вам, - это гарантированный перенос на указанной границе при переполнении / потере значимости, и даже тогда только для беззнаковых типов, поскольку переполнение не определено для подписанных.

Помимо этого, нет переносимого способа сделать это в чистом виде. C90. Среди прочего, соответствующая реализация C90 не обязательно должна иметь даже 8-битное целое число, например - было бы совершенно законно иметь платформу, в которой sizeof (char) == sizeof (short) == sizeof (int) == 1 и CHAR_BIT == 16 (т. Е. Он имеет 16-битное машинное слово и не может адресовать отдельные байты). Я слышал, что такие платформы действительно существуют на практике в виде некоторых DSP.

3
ответ дан 18 December 2019 в 08:29
поделиться

Нет, вы не можете этого сделать.

Теперь, если вы хотите учитывать многоступенчатый процесс настройки, такой как Gnu configure , как решение, вы можете сделайте это и придерживайтесь C89. И, безусловно, есть различные типы, которые вы можете использовать, такие как в C89, и это будет DTRT почти во всех реализациях, существующих сегодня, поэтому вы получаете нужные размеры и придерживаетесь чистого соответствия C89. Но битовая ширина, какая вам нужна, обычно не определяется стандартом.

0
ответ дан 18 December 2019 в 08:29
поделиться

Строго говоря, ISO 9899: 1999 заменил ISO 9899: 1990, поэтому это единственная текущая спецификация языка C стандарта ISO.

Поскольку имена typedef с точной шириной для целочисленных типов были введены в стандарт только в версии 1999 года то, что вы хотите, невозможно при использовании только версии стандарта 1990 года.

7
ответ дан 18 December 2019 в 08:29
поделиться
Другие вопросы по тегам:

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