2016-01-25 3 views
5

Я использую стороннюю статическую библиотеку (файл .lib) в проекте на C++. Автор статической библиотеки добавил мне метод для класса и отправил мне обновленную сборку библиотеки.Описывает ли порядок объявлений методов в классе компилятору?

К сожалению, он не отправил новый файл заголовка, и общение с ним происходит медленно, поэтому я не могу получить новый заголовок в ближайшее время. Я знаю подпись метода нового метода, поэтому я могу просто добавить его в файл заголовка.

Мой вопрос заключается в том, имеет ли значение, когда в списке общедоступных методов я добавляю новое объявление (верхний, нижний, средний ...). Мое лучшее предположение заключается в том, что он делает и что порядок в файле заголовка определяет порядок в скомпилированном классе. Может кто-то подтвердить или опровергнуть это?

+4

Возможный дубликат: http://stackoverflow.com/questions/19858914/does-the-function-declaration-order-matter-in-a-header-file – user2079303

+1

Пожалуйста, посмотрите [этот stackoverflow] (http : //stackoverflow.com/questions/19858914/does-the-function-declaration-order-matter-in-a-header-file), что объясняет все подробно. – Derlin

+0

Спасибо вам обоим. Вопрос, на который вы ссылаетесь, помогает моему пониманию. – adv12

ответ

11

Мой вопрос имеет ли он, где в списке публичных методов добавить новое объявление

AFAIK, это не имеет значения, если функция член регулярная функция, но это имеет значение, если это virtual участник функция. Виртуальные функции-члены в виртуальной таблице находятся в определенном порядке. Если библиотека имеет их в другом порядке, чем ваш .h-файл, скорее всего, вы вызовете неправильную функцию.

Похожие: Force the order of functions in the virtual method table?

+0

Ничего себе, я не думал о проблеме с 'virtual's, но это, кажется, очень реальный риск. Дубликаты, упомянутые выше, упоминают об этом попутно, и ссылка KDE, похоже, находится на должной глубине в отношении разветвлений с точки зрения ABI. –

+0

Спасибо за информацию. В моем случае функции не являются виртуальными, поэтому я просто добавлю новое объявление метода в нижней части списка и надеюсь, что вы правы :) – adv12

+0

@ adv12, меня укусил порядок виртуальных таблиц назад, в начале 2000-х годов. Если функция-член является регулярной функцией-членом, вы должны быть в порядке. Удачи. –

0

Если декларация метод не использует типы, объявленные в классе, как, например, тип возвращаемого значения, то это не имеет значения, где объявлен метод.

В противном случае, если объявление метода зависит от деклараций других типов внутри класса, тогда может произойти ошибка.

Например, компилятор выдаст сообщение об ошибке для этого класса определения

struct A 
{ 
    B f(); 
    struct B {}; 
    //... 
}; 

потому, что тип struct B используется в функции члена декларации f до самой структуры декларации.

+0

Спасибо за информацию. В моем случае эта функция является «void something (CString)» (класс строки MFC) и не использует никаких типов, определенных в заголовке. Поэтому моя забота заключалась в том, приведет ли включение объявления метода в «неправильное» место в определении класса, чтобы вызвать неправильный метод. Но я забыл о компоновщике.Я больше всего знаком с C#, где этот вопрос не возникает. – adv12

+0

@ adv12 В этом случае нет проблем, если декларация функции не зависит от объявлений других членов класса. –

0

Объявление метода в классе не должно иметь значения для компилятора, если оно не зависит от объявления переменной, которое еще не выполнено.

Смежные вопросы