результат связывания двух сильных функциональных символов с одинаковой сигнатурой функции использует g ++ и почему?

0

Я смущен процедурой связывания при связывании двух одинаковых символов функции.

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

Теги:
gcc
compiler-construction
symbol

2 ответа

0

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

Какова реальная проблема, которую вы хотите решить? Потому что это явно не путь решения.

  • 0
    Родригес: Я не пытаюсь решить проблему, а просто хочу выяснить эти концепции. Я прочитал ODR, все еще есть вопросы: если в одном объекте символ является слабым символом, почему результат связывания не всегда является сильным символом
  • 0
    @zuanyg: Это не связано с языком, но с конкретным компоновщиком, который вы используете. С точки зрения языка, ваша программа плохо сформирована, диагностика не требуется и все может произойти. Я не очень хорошо знаком с использованием компоновщика за пределами стандартных санкций, поэтому я не могу комментировать дальше. Прочитайте документацию вашего компоновщика.
0

Ещё вопросы

Сообщество Overcoder
Наверх
Меню