У нас есть много устаревшего кода на C++ с функциями, которые принимают переменное количество аргументов указателя. В каждом случае нулевые указатели сигнализируют конец списка аргументов. В устаревшем коде для нулевого указателя используется буква 0. Поскольку функции списка аргументов переменных C++ не прототируют типы аргументов переменной, завершающий аргумент передается как целое число 0. В некоторых 64-разрядных средах целые числа являются 32-разрядными, а указатели - 64-разрядными. Существует ли риск того, что вызываемая функция увидит ненулевой указатель (т. Е. 32-разрядное слово младшего разряда равно нулю, но 32-разрядные разряды высокого порядка содержат мусор)? Изменение всех аргументов 0 в nullptr, по-видимому, было бы правильным подходом. Мой вопрос: это необходимо? т. е. существует ли реальный риск ошибки, если мы этого не сделаем?завершение переменных аргументов с нулевым указателем
class mytype;
void foo(mytype*, ...);
mytype a, b, c;
foo(&a, &b, &c, 0); //is this ok ?
foo(&a, &b, &c, nullptr); //or must it be so ?
Примечание: 'nullptr' становится значением' void * 'при передаче как нетипизированный аргумент, а не' int'. Это отличается от передачи '0', которая (и остается)' int'. –
Будет ли это решение для создания шаблона вариационной функции? Вы можете сохранить семантику вызова. –
Я бы добавил к предложению Керрека, что вы можете переименовать существующую функцию 'foo()', например. 'foo_impl()', а затем создать либо шаблон, либо кучу перегрузок (сколько раз вам нужно количество аргументов?), которые затем делегируют 'foo_impl()' с правильными типами параметров. Вставляя это, ваш код не должен даже расти в размерах или замедляться. –