Как обнаружить объявленные, но undefined функции в С++?
Следующие компиляции, ссылки и простое исполнение (на Xcode 5.1/clang):
#include <iostream>
class C { int foo(); };
int main(int argc, const char * argv[])
{
C c;
cout << "Hello world!";
}
Однако C::foo()
не определяется нигде, только объявлен. Я не получаю никаких предупреждений/ошибок компилятора или компоновщика, по-видимому, потому, что C::foo()
никогда не ссылается нигде.
Есть ли какой-либо способ я могу предупредить, что во всей программе не существует определения для C:: foo(), даже если оно объявлено? Ошибка будет лучше.
Спасибо!
Ответы
Ответ 1
Есть веские причины, по которым это непросто. Набор файлов заголовков может объявлять множество функций, некоторые из которых предоставляются дополнительными библиотеками. Вы можете использовать #include
такие заголовки, не используя все эти функции (например, если вы хотите использовать только константу #define
-d).
В качестве альтернативы, законно иметь некоторый заголовок и реализовать (в вашей библиотеке) только подмножество API, определяемое файлами заголовков.
И заголовочный файл С++ или C также может определять интерфейс кода, определенный потенциальными плагинами, для программ, которые обычно запускаются без плагинов. Многие программы, принимающие плагины, объявляют интерфейс плагина в своем файле заголовка.
Если вам действительно нужна такая проверка, возможно, вы можете настроить GCC с помощью MELT; однако такая проверка не является тривиальной для реализации в настоящее время (и вам также потребуется оптимизация времени ссылки).
Ответ 2
Возможно, попробуйте вызвать все функции на вашей карте реализации и добавить попытку catch, которая выплевывает предупреждение, если они segfault.
Ответ 3
У вас нет. Или, скорее, это не компилятор
Наверное, я просто повторяю, что другие говорили в комментариях, но:
- На самом деле это функция (см. невыполненный частный конструктор)
- На самом деле это не помогло бы, так как "ошибка" здесь заключается в том, что некорректная очистка кода не была выполнена до совершения кода, а невыполненная и неиспользуемая функция действительно является самой маленькой проблемой. Как насчет всего остального, что не было очищено? Вероятность наличия реализованной и неиспользуемой функции кажется мне такой же высокой, и эта же беспорядок более или менее.
Вместо того, чтобы беспокоиться об этом конкретном случае, я бы проверял, было ли это всего лишь однократный сбой, или если ваша команда разработчиков может улучшить некоторые процедуры, которые предотвратили бы такие вещи в будущем.
Ответ 4
Что касается языков, таких как С++, то обнаружение и сообщение функций undefined приведет к поражению одной из важных функций, предоставляемых им. Виртуальные/чисто-виртуальные функции являются одним из важных механизмов, с помощью которых С++ реализует полиморфизм во время выполнения.
Если вы разрабатываете библиотеку, которая будет использоваться ее клиентами, вы можете иметь объявленные, но не определенные виртуальные функции. Вы можете оставить определение для своих клиентов. В таких случаях, если компилятор должен был сообщить о таких функциях undefined, это не будет полезно.