Обнаружить использование макроса? (errno)

Необходимо ли быть в состоянии использовать нежадные кванторы, конкретно *?. Вы собираетесь, вероятно, хотеть следующее:

Pattern MY_PATTERN = Pattern.compile("\\[(.*?)\\]");

Это даст Вам шаблон, который будет соответствовать Вашей строке и помещать текст в квадратных скобках в первой группе. Взгляните на документация API Шаблона для получения дополнительной информации.

Для извлечения строки Вы могли использовать что-то как следующее:

Matcher m = MY_PATTERN.matcher("FOO[BAR]");
while (m.find()) {
    String s = m.group(1);
    // s now contains "BAR"
}

9
задан Brian Tompsett - 汤莱恩 12 February 2016 в 09:43
поделиться

3 ответа

Здесь нет гениальных идей, но afaik errno может быть реализован через вызовы функций, чтобы сделать возможными потокобезопасные реализации стандартной библиотеки. Я не думаю, что ленивые запросы к FPU - хорошая идея: как избежать несогласованности в таких ситуациях:

  • set errno
  • операции с плавающей запятой, которые устанавливают флаги ошибок
  • get errno
  • get flags

Должен ли вызов __ errno () сбрасывать флаги или нет?

Согласно стандарту, должно ли errno устанавливаться математическими функциями, определяется значением math_errhandling (в частности, math_errhandling & MATH_ERRNO ).

Что бы я хотел do - сделать сообщение об ошибке необязательным через директивы препроцессора и позволить программисту установить значение math_errhandling во время компиляции. Это означало бы, что математические функции не могут быть скомпилированы статически заранее, а должны находиться в заголовке, что в любом случае может быть хорошей идеей, чтобы позволить компиляторам без оптимизации времени компоновки встраивать эти функции.

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

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

4
ответ дан 4 December 2019 в 23:07
поделиться

Здесь вы получаете довольно хороший анализ того, почему весь механизм errno так неудовлетворителен. Вы также можете найти аналогичный анализ в «Стандартной библиотеке C» Кернигана.

Функциональная форма errno также необходима для поточно-ориентированных реализаций, где разные потоки имеют отдельные значения ошибок, к которым осуществляется доступ через поток -specific errno .

Вероятно, ваш макрос должен заключаться в круглые скобки для безопасности:

#define errno (*__errno())
2
ответ дан 4 December 2019 в 23:07
поделиться

More a comment than an answer, but without code formatting it would not be understandable.

If you check lazily the FPU flags, how would you have the correct behavior here (the math functions are special in that they are guaranteed not to modify errno when there is no problem)?

errno = 0;
x = acos(y);
z = <exp>;
if (errno != 0) {
   /* can't come here even if y is a valid argument but <exp> modified the flags if it didn't call any functions */
}
1
ответ дан 4 December 2019 в 23:07
поделиться
Другие вопросы по тегам:

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