Определите функцию, имя которой маскируется макросом

Вы можете изменить обработчик событий для события mousedown. При этом оператор return false поможет вам не потерять фокус ввода.

$(".delete").on("mousedown",function(evt) {
        var nameInput = document.querySelector("#name")
        var cursorPosition = nameInput.selectionStart;

    $("#name").val(
        function(index, value){
            return value.substr(0,cursorPosition - 1) + value.substr(cursorPosition);
    });

    nameInput.selectionStart = cursorPosition - 1;
    nameInput.selectionEnd = cursorPosition - 1;

    return false;
});
1
задан Cyan 19 January 2019 в 02:11
поделиться

2 ответа

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

int (function)(int i) {
    ...
}

Это предотвращает сопоставление и расширение функционально-подобного макроса, но не влияет на определение.

0
ответ дан Chris Dodd 19 January 2019 в 02:11
поделиться

Иногда бывает удобно замаскировать функцию макросом с тем же именем.

Макроподобные функции-обертки, такие как

static inline int actual_function(int i)
{
    /* extra stuff */
    return function(i);
}

, являются лучшим вариантом во время компиляции из-за принципа наименьшего сюрприза. (Например, вы удивляете разработчиков, они делают глупости. Поэтому, чем меньше сюрпризов, тем меньше глупых ошибок они могут совершить.)

К сожалению, это не помогает с изменением имени. Лично мне все равно, потому что переименование в любом случае быстро find . -name '*.[ch]' -exec sed -e 's|\bOLDNAME\b|NEWNAME|g' -i '{}' ';'.


Для динамически связанных символов мы можем обернуть или вставлять их собственные во время выполнения. Это сильно зависит от ОС и инструментария.

В Linux есть две опции: использование средств динамического компоновщика ( dlsym() ) или опция компоновщика --wrap. Он работает только с динамически связанными символами, но обычно, по крайней мере, стандартная библиотека связана динамически.

Проще говоря, если вы хотите заменить, скажем, динамически связанную malloc() на вашу собственную функцию, вы можете использовать

#define  _GNU_SOURCE
#include <stdlib.h>
#include <dlfcn.h>

static void *(*real_malloc)(size_t) = NULL;

void *malloc(size_t size)
{
    if (!real_malloc)
        real_malloc = dlsym(RTLD_NEXT, "malloc");
    /* extra stuff */
    return real_malloc(size);
}

Если вы хотите сделать вышеописанное в поточно-ориентированном виде, это становится немного сложнее. (Я использую __atomic_load_n() и т. Д., Так что это всего лишь несколько строк кода.)

Проще всего сказать, что GCC должен сделать магию символов для нас, предоставив ему опцию -Wl,-wrap,malloc при компиляции и связывание двоичного файла. Затем

#include <stdlib.h>

void *__real_malloc(size_t);

void *__wrap_malloc(size_t size)
{
    /* extra stuff */
    return __real_malloc(size);
}

На этот раз вставка / перенос выполняется на уровне таблицы символов.

0
ответ дан Nominal Animal 19 January 2019 в 02:11
поделиться
Другие вопросы по тегам:

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