Будет ли компоновщик сравнивать уровень доступа при поиске функции-члена во время компоновки? - PullRequest
0 голосов
/ 05 января 2011

Случайно, я сталкиваюсь с ошибкой связывания. Программа выглядит примерно так:

//a.h
class A
{
int a;
#ifdef AAA
public:
#endif
int getA();
}

//a.cpp
include "a.h"
int A::getA()
{
return a;
}

//test.cpp
#include "a.h"
int main()
{
A a;
a.getA();
return 0;
}

Эти три файла находятся в двух проектах, ah и a.cpp в проекте A, в котором макрос AAA не определен, test.cpp в проекте Test, в котором AAA макрос определен. И проект Test зависит от проекта A. Тогда я сталкиваюсь с ошибкой ссылки. Я сделал этот тест на Visual Studio 2008.

Так что мой вопрос таков: "Будет ли ссылка сравнивать уровень доступа при поиске символа функции-члена во время соединения?" По моему предыдущему мнению, уровень доступа действует только при компиляции. Но в этом случае кажется, что уровень доступа также может влиять на время соединения.

1 Ответ

0 голосов
/ 05 января 2011

Линкер невиновен.Компиляторы C ++ mangel присваивают имена и включают в себя такие вещи, как модификаторы доступа, перегрузки (т. Е. Типы возвращаемых данных и аргументов), шаблоны (не совсем уверены) и т. Д. ... в конечном итоге, чтобы создать нечто однозначное, что также формирует любой компоновщиксчитает действительным идентификатором (по крайней мере [a-zA-Z_][a-zA-Z0-9_]*, поскольку C не требует искажения).Компоновщик видит только это искаженное имя и не может сообщить ничего, кроме «Вы вызываете эту функцию, но она нигде не определена».public A::getA() другое имя как private A::getA().

Решение?Не используйте препроцессор для таких вещей.Или убедить разработчиков VS перехватывать такие сообщения об ошибках и переводить их во что-то более осмысленное (но поскольку в прошлом они этого не делали и нормальный код редко сталкивался с этой проблемой, это маловероятно).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...