Как обнаружить объявленные, но 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, это не будет полезно.