Итак, я сделал еще несколько экспериментов, и вот что я нашел. Кажется, он основан на том, является ли каждая переменная массивом. Учитывая этот вход:
void f5() {
int w;
int x[1];
int *ret;
int y;
int z[1];
}
В итоге я получаю это в gdb:
(gdb) p &w
$1 = (int *) 0xbffff4c4
(gdb) p &x
$2 = (int (*)[1]) 0xbffff4c0
(gdb) p &ret
$3 = (int **) 0xbffff4c8
(gdb) p &y
$4 = (int *) 0xbffff4cc
(gdb) p &z
$5 = (int (*)[1]) 0xbffff4bc
В этом случае int
s и указатели обрабатываются сначала, последним объявленным в верхнюю часть стека и сначала объявили ближе к основанию. Затем массивы обрабатываются в противоположном направлении, чем раньше декларация, самая высокая в стеке. Я уверен, что для этого есть веская причина. Интересно, что это.
Заменять все специальные символы для использования в качестве строкового литерала динамично:
str = '`Hello`\\n${world}';
esc = str.replace(/\\|`|\$/g, '\\[110]amp;');
console.log(eval('`' + esc + '`') === str);
мне было нужно это для некоторого материала генерации кода. Эти str
было содержание файла JS, и цель состояла в том, чтобы поместить это содержание в переменную строкового литерала в другого, генерировал файл JS.
Печально кажется, что существует (2019) никакая собственная функция JS для этого выхода. Символы, который должен быть заменен, (насколько я знаю): \
, $
и \
.