Что определяет этот макрос?

Я считал эту часть макроса (C код) и был смущен в декодировании его для знания то, что это определяет. Что это определяет?

#define sram (*((unsigned char (*)[1]) 0))

- AD

9
задан goldenmean 23 February 2010 в 18:01
поделиться

3 ответа

Прежде чем приступать к разработке языков программирования, вам нужно будет многое узнать о них. Я рекомендую Языки программирования: применение и интерпретация Шрирама Кришнамуртхи .

-121--1527104-

Ну, я еще не видел ответа на «Что они физически». Так что я попробую.

Процессы и потоки не являются никакими физическими. Они являются особенностью операционной системы. Обычно любой физический компонент компьютера не знает о них. ЦП обрабатывает только последовательный поток кодов операций. Эти коды операций могут принадлежать потоку. Затем ОС использует ловушки и прерывает восстановление управления, решает, какой код следует выполнить, и переключается на другой поток.

-121--1039958-

Я думаю, что sram означает «запуск ОЗУ».


unsigned char[1]

Массив 1 размера неподписанных символов.

unsigned char(*)[1]

Указатель на массив размера 1 неподписанных символов.

(unsigned char (*)[1]) 0

Приведение 0 к указателю на массив размера 1 неподписанных символов.

*((unsigned char (*)[1]) 0)

Считывайте часть памяти в расположении 0 и интерпретируйте результат как массив 1 размера неподписанных символов.

(*((unsigned char (*)[1]) 0))

Просто чтобы избежать 1 + 5 * 8 + 1 = 42 .

#define sram (*((unsigned char (*)[1]) 0))

Определите переменную sram в памяти, начиная с местоположения 0, и интерпретируйте результат как массив 1 размера неподписанных символов.

12
ответ дан 4 December 2019 в 14:28
поделиться

Почему бы просто не заменить regex целиком?

$(".myFieldsetClass label:contains('Some Label ')")
    .each(function() {
            $(this).html($(this).html().replace(/Some Label ./, "Some Label")); 
        });
-121--2818470-

Если вам нужны только те исключения, о которых вы знаете при написании кода, то вы можете написать обработчик, который сможет справиться со всеми "известными" исключениями. Хитрость заключается в том, чтобы вернуть исключение, которое вы поймали с catch (...) , а затем поймать различные известные исключения...

Итак, что-то вроде:

try
{
 ...
}
catch(...)
{
   if (!LogKnownException())
   {
      cerr << "unknown exception" << endl;
   }
}

где LogKnureException () выглядит примерно так:

bool LogKnownException()
{
   try
   {
      throw;
   }
   catch (const CMyException1 &e)
   {
      cerr << "caught a CMyException: " << e << endl;

      return true;
   }
   catch (const Blah &e)
   {
      ...
   }
   ... etc

   return false;
}
-121--4349286-

Я думаю, что возвращает базовый адрес (0) памяти (ОЗУ):)

1
ответ дан 4 December 2019 в 14:28
поделиться

Он определяет sram как указатель на память, начиная с нуля. Вы можете получить доступ к памяти через указатель, например sram [0] - это адрес ноль, sram [1] - это данные по адресу один, и т. д.

В частности, он приводит к приведению 0 как указателя на массив беззнаковых символов и косвенно проходит через него (оставляя массив беззнаковых символ).

Аналогичный результат может быть получен с помощью

#define sram ((unsigned char*)0)

. Он также полностью не определен в стандарте C, но это не мешает людям использовать его и заставлять ангелов вылетать из их пупка.

1
ответ дан 4 December 2019 в 14:28
поделиться
Другие вопросы по тегам:

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