0

2 つの同じ関数シンボルをリンクする場合、リンク手順について混乱しています。

ポイント.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

ポイント.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;
}

私は2つのオブジェクトを取得します

g++ -o double_point -DDOUBLE_POINT -c point.cpp
g++ -o int_point -c point.cpp

g++ を使用して、それらを test.cpp でリンクします。

私の質問は:

それらを正常にリンクできる理由、同じシンボルが 2 つあるということ、なぜ ld でエラーが発生しないのか

関数の 1 つで弱いシンボルを使用すると、リンクの結果は常に強い関数シンボルになると思いますが、結果は変わらず、常にシンボルが最初に来る理由を知りたいです。

私のコンパイラ:

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) でコンパイル。

BFD バージョン 2.15.92.0.2 を使用する GNU アセンブラー バージョン 2.15.92.0.2 (x86_64-redhat-linux) 20040927

4

2 に答える 2

0

次のリンクをご覧ください。

C++: 異なる翻訳単位で同じ名前の異なるクラス

http://en.wikipedia.org/wiki/One_Definition_Rule

于 2013-10-08T12:35:53.060 に答える