Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用g+将具有相同函数签名的两个强函数符号链接的结果+;为什么?_C++_Linux_Gcc_Compiler Construction_Symbols - Fatal编程技术网

C++ 使用g+将具有相同函数签名的两个强函数符号链接的结果+;为什么?

C++ 使用g+将具有相同函数签名的两个强函数符号链接的结果+;为什么?,c++,linux,gcc,compiler-construction,symbols,C++,Linux,Gcc,Compiler Construction,Symbols,当链接两个相同的函数符号时,我对链接过程感到困惑 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

当链接两个相同的函数符号时,我对链接过程感到困惑

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++将它们与test.cpp链接在一起

我的问题是:

为什么我可以成功链接它们,我的意思是有两个相同的符号,为什么ld没有得到错误

我认为如果我在其中一个函数上使用弱符号,链接结果将始终是强函数符号,但结果不会改变,始终是符号排在第一位,我想知道为什么

我的编译器:

GNU C++版本3.4.5 20051201(红帽3.4.5-2)(X86Y64-REDATH-Linux) 由GNU C版本3.4.5 20051201(Red Hat 3.4.5-2)编译


使用BFD版本2.15.92.0.2 20040927的GNU汇编程序版本2.15.92.0.2(x86_64-redhat-linux)请查看以下链接:


您违反了“一个定义”规则,从而导致未定义的行为。虽然我理解您可能想要做什么,但事实是您的代码是错误的,编译器工具链不需要提供任何特定的行为


你想解决的真正问题是什么?因为这显然不是解决问题的方法。

你是说参数
pt
x
在函数
get__y
上是不同的吗?罗德里格斯:我不是想解决问题,只是想弄清楚这些概念。我读了ODR,仍然有疑问:如果一个对象中的符号是弱符号,为什么链接的结果并不总是强符号symbol@zuanyg:与语言无关,但与您使用的特定链接器无关。从语言的角度来看,您的程序格式不正确,不需要诊断,任何事情都可能发生。我不太熟悉标准制裁之外的链接器用法,因此我无法进一步评论。阅读链接器的文档。
g++ -o double_point -DDOUBLE_POINT -c point.cpp
g++ -o int_point -c point.cpp