preg_*
функции ожидают Perl совместимые регулярные выражения с разделителями. Так попробуйте это:
preg_replace('/[[:punct:]]/', ' ', $string)
Да , вы можете.
Заголовочный файл 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
Нет. Однако есть надежный способ объявить отдельные целочисленные переменные размером до 32 бит, если вы хотите жить с некоторыми ограничениями. Просто используйте длинные
битовые поля (последнее гарантированно будет иметь ширину не менее 32 бит, и вам разрешено использовать до такого количества битов в битовых полях, сколько поместится в переменной, если декларатор битового поля был опущен ). Итак:
struct {
unsigned long foo : 32;
} bar;
Очевидно, вы получаете все связанные с этим ограничения, такие как невозможность иметь указатели на такие переменные. Единственное, что это действительно дает вам, - это гарантированный перенос на указанной границе при переполнении / потере значимости, и даже тогда только для беззнаковых типов, поскольку переполнение не определено для подписанных.
Помимо этого, нет переносимого способа сделать это в чистом виде. C90. Среди прочего, соответствующая реализация C90 не обязательно должна иметь даже 8-битное целое число, например - было бы совершенно законно иметь платформу, в которой sizeof (char) == sizeof (short) == sizeof (int) == 1
и CHAR_BIT == 16
(т. Е. Он имеет 16-битное машинное слово и не может адресовать отдельные байты). Я слышал, что такие платформы действительно существуют на практике в виде некоторых DSP.
Нет, вы не можете этого сделать.
Теперь, если вы хотите учитывать многоступенчатый процесс настройки, такой как Gnu configure
, как решение, вы можете сделайте это и придерживайтесь C89. И, безусловно, есть различные типы, которые вы можете использовать, такие как в C89, и это будет DTRT почти во всех реализациях, существующих сегодня, поэтому вы получаете нужные размеры и придерживаетесь чистого соответствия C89. Но битовая ширина, какая вам нужна, обычно не определяется стандартом.
Строго говоря, ISO 9899: 1999 заменил ISO 9899: 1990, поэтому это единственная текущая спецификация языка C стандарта ISO.
Поскольку имена typedef с точной шириной для целочисленных типов были введены в стандарт только в версии 1999 года то, что вы хотите, невозможно при использовании только версии стандарта 1990 года.