Вы можете изменить обработчик событий для события 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;
});
Альтернативный трюк для функционально-подобных макросов состоит в том, чтобы поместить в декларатор избыточные скобки в определении:
int (function)(int i) {
...
}
Это предотвращает сопоставление и расширение функционально-подобного макроса, но не влияет на определение.
Иногда бывает удобно замаскировать функцию макросом с тем же именем.
blockquote>Макроподобные функции-обертки, такие как
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); }
На этот раз вставка / перенос выполняется на уровне таблицы символов.