vitus_wagner: My photo 2005 (Default)
[personal profile] vitus_wagner
Вот такую странную картину я тут наблюдаю:

Debian testing, gcc 8.2.0. Имеется вот такой C-шный код:
static void log (int elevel,  const char *fmt, va_list args)
{
 bool write_to_file, write_to_stderr, write_somewhere_else;
 va_list error_args, std_args;
.... здесь вычисляем куда надо писать
if (write_to_file && write_to_stderr) 
  va_copy(std_args,args);

.... некоторое количество кода, заведомо не меняющего флагов write_to
if (write_to_file) {
   vfprintf(f,fmt, args);
}
if (write_to_stderr) {
   if (write_to_file) {
      vfprintf(stderr, fmt, std_args);
   } else {
      vfprintf(stderr,fmt,args);
   }
   ffush(stderr);
}


В 64-битной системе компилятор кушает этот код без вопросов. В 32-битной ругается

error: ‘std_args’ may be used uninitialized in this function [-Werror=maybe-uninitialized]
vfprintf(stderr, fmt, std_args);

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

Date: 2018-12-10 07:09 am (UTC)
qkowlew: На Зилантконе меня сфоткали мыльницей. Мыльницам не позирую! (Default)
From: [personal profile] qkowlew
Может быть разница в реализации макросов.
У меня было как-то ещё в эпоху PDP-11 и "Ленинградского Си" анекдотическое.

if (условие) функция();

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

if (условие) { функция(); }

компилировалось как ожидалось и работало правильно.

Date: 2018-12-10 09:04 am (UTC)
livelight: (Default)
From: [personal profile] livelight
А вот тех, кто пишет такой развесистый макрос, не окружив его собственными скобками соответствующей формы, надо бить канделябрами.

Date: 2018-12-10 10:14 am (UTC)
livelight: (Default)
From: [personal profile] livelight
Раз ручное окружение вызова макроса фигурными скобками помогает - значит, макрос обязан сам в себя включать эти фигурные скобки, чтобы гарантированно сохранять синтаксическую целостность своего тела.

К счастью, конфликтов, когда в одних контекстах надо бы окружать фигурными скобками, а в других - круглыми, в Си не бывает. По крайней мере, я таких примеров не встречал.

Date: 2018-12-10 10:19 am (UTC)
livelight: (serenity)
From: [personal profile] livelight
А ещё в куковлевском примере с финальным ";" могут быть проблемы, если после if с макросом идёт else. Вот эта болезнь языка препроцессора не имеет хорошего лекарства, кроме опять же ручного окружения if-блока и else-блока в собственные фигурные скобки.

Ну и вообще врождённых болезней у языка препроцессора много :)

Date: 2018-12-10 10:54 am (UTC)
yurikhan: (Default)
From: [personal profile] yurikhan

Ну каноническое решение против else выглядит как

#define DO_SOMETHING(x) \
    do { \
        do_something_one(x); \
        do_something_two(x); \
    } while (0)

// …

if (condition)
    DO_SOMETHING(y);
else
    do_something_three(y);

Date: 2018-12-10 11:01 am (UTC)
livelight: (Default)
From: [personal profile] livelight
Точно, было такое лекарство. Хотя назвать его "хорошим" язык не поворачивается :)

Date: 2018-12-10 11:06 am (UTC)
yurikhan: (Default)
From: [personal profile] yurikhan
Ну, оно невкусное, да. В общем-то как и большинство лекарств.

Date: 2018-12-11 02:35 am (UTC)
From: [personal profile] zevaka_derevnia
Вот - только хотел написать. Старое и давно известное средство.

Profile

vitus_wagner: My photo 2005 (Default)
vitus_wagner

June 2025

S M T W T F S
1 23 4 56 7
89 1011 12 13 14
1516 17 18 192021
22232425262728
2930     

Most Popular Tags

Page Summary

Style Credit

Expand Cut Tags

No cut tags
Page generated Jun. 20th, 2025 11:08 am
Powered by Dreamwidth Studios