Я смущен процедурой связывания при связывании двух одинаковых символов функции.
point.h:
#ifndef _POINT_H_
#define _POINT_H_
struct dpoint_t
{
/* data */
double x, y;
};
struct ipoint_t
{
/* data */
int x, y;
};
#ifdef DOUBLE_POINT
typedef struct dpoint_t data;
#else
typedef struct ipoint_t data;
#endif
struct Point
{
data p;
int idx;
};
/*
#ifndef DOUBLE_POINT
__attribute__ ((weak))
#endif
*/
void * get_y(struct Point &x);
#endif
point.cpp:
#include "point.h"
void * get_y(struct Point &pt)
{
int a = 1;
return &(pt.p.y);
}
test.cpp:
#include <stdio.h>
#include "point.h"
int main()
{
struct Point x;
x.p.x = 10.0;
x.p.y = 5.0;
void *p = get_y(x);
printf("double: %lf\nint: %d\n", *(double *)p, *(int *)p);
return 0;
}
Я получаю два объекта:
g++ -o double_point -DDOUBLE_POINT -c point.cpp
g++ -o int_point -c point.cpp
и позвольте использовать g++, чтобы связать их вместе с test.cpp
Мой вопрос:
почему я могу связать их успешно, я имею в виду, что есть 2 одинаковых символа, почему ld не получает ошибку
Я думаю, что если я использую слабый символ на одной из функций, результат связывания всегда будет сильным символом функции, но результат не изменится, он всегда будет первым символом, я хочу знать, почему
мой компилятор:
Версия GNU C++ 3.4.5 20051201 (Red Hat 3.4.5-2) (x86_64-redhat-linux), скомпилированная версией GNU C версии 3.4.5 20051201 (Red Hat 3.4.5-2).
Ассемблер GNU версии 2.15.92.0.2 (x86_64-redhat-linux) с использованием BFD версии 2.15.92.0.2 20040927
Вы нарушаете правило одного определения и тем самым вызывают неопределенное поведение. Хотя я понимаю, что вы, возможно, захотите сделать, факт состоит в том, что ваш код неправильный, а инструментальная цепочка компилятора не требует какого-либо конкретного поведения.
Какова реальная проблема, которую вы хотите решить? Потому что это явно не путь решения.
Посмотрите на следующие ссылки:
C++: разные классы с одинаковым именем в разных единицах перевода