函数内部匿名static union为什么会在连接的时候报错

lgf2002 2009-11-27 10:05:15
比如下面的代码,会报错,在Dev-C++下报
[Linker error] undefined reference to `startUp()::c'
在vxworks下的实际项目中报 holds reference to undefined symbol错误
但是如果把这个union放函数的外面,就不会报错。在函数内部,如果不是匿名的,无论是静态或者非静态,都不会报错。从理论上我不能解释,是否有对这个比较清楚的高手,解释下,谢谢
#include <iostream>
using namespace std;
void startUp()
{
static union
{
int c;
int d;
};
c=12;
cout<<d<<endl;
}
int main()
{
startUp();
getchar();
return 0;
}
...全文
252 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
SammyLan 2009-11-28
  • 打赏
  • 举报
回复
楼主
你的代码没有任何问题
匿名union就该这样用的
之所以在其它编译器有问题那是编译器对标准的支持不好而已
别砖牛角尖了
你用的编译器不支持你谁都没办法
lgf2002 2009-11-28
  • 打赏
  • 举报
回复
这里这么多强人,难道没人能解释这个问题,郁闷呀
arong1234 2009-11-27
  • 打赏
  • 举报
回复
难道又是新标准说法?我理解的匿名union是指union自己没有名字,而不是不定义对象。除了static成员变量,C++从来不允许直接给类型的成员直接赋值。

[Quote=引用 4 楼 lgf2002 的回复:]
呵呵,谢谢2,3楼的,像你那样用,当然没有问题,但是你那就不叫匿名union,我之所以用匿名unoin是因为实际项目中,有很多地方都涉及到比如这里的b,如果加上对象,那么我就得改几十个地方。这里如果不用static的,也不会有问题。但是如果GCC编译选项严格,就有一条规范,匿名union必须是static的,如果不是,就会报warning,这也是不允得
[/Quote]
eatsweetpotato 2009-11-27
  • 打赏
  • 举报
回复
学习了
lgf2002 2009-11-27
  • 打赏
  • 举报
回复
有人知道吗?我自己顶
lgf2002 2009-11-27
  • 打赏
  • 举报
回复
呵呵,谢谢2,3楼的,像你那样用,当然没有问题,但是你那就不叫匿名union,我之所以用匿名unoin是因为实际项目中,有很多地方都涉及到比如这里的b,如果加上对象,那么我就得改几十个地方。这里如果不用static的,也不会有问题。但是如果GCC编译选项严格,就有一条规范,匿名union必须是static的,如果不是,就会报warning,这也是不允得
arong1234 2009-11-27
  • 打赏
  • 举报
回复
我很怀疑你的union放在外面就不报错的说法
arong1234 2009-11-27
  • 打赏
  • 举报
回复
你只定义了一个匿名类型,没有定义对象,基本的语法都不对



static union
{
int c;
int d;
}obj;//这里obj才是对象
obj.c = 12;//这才是正确访问对象的成员


lg29335464 2009-11-27
  • 打赏
  • 举报
回复
沙发
lingling1989r 2009-11-27
  • 打赏
  • 举报
回复
我的也3.4.2。
但是不知道为什么没问题。编译器允许给类型的成员赋值总觉的囧。
mark~
arong1234 2009-11-27
  • 打赏
  • 举报
回复
:)我是否认识到其实无所谓,即使可以用,我也不见得会去用
[Quote=引用 14 楼 lgf2002 的回复:]
希望你有一天能够认识到是可以直接使用的

引用 13 楼 arong1234 的回复:
共用地址是指union内部的各个成员之间,不是说union自己可以不实例化直接使用吧?
我还是觉得你这是误用
引用 12 楼 lgf2002 的回复:
呵呵,你们说的都有道理,但是我这种用法不是没有,这里出错得原因是,在函数内部,且是static的,出了函数,就不会有问题。
我之所以这样用,是为了消除原来代码中的一个警告,想利用union公用地址的特点,进行隐式内型转换。但是又不想在原来代码前都加一个对象,所以想用a类型的变量接收数据,然后用b类型直接去用,这是消除警告的最小改动。


[/Quote]
lgf2002 2009-11-27
  • 打赏
  • 举报
回复
希望你有一天能够认识到是可以直接使用的

[Quote=引用 13 楼 arong1234 的回复:]
共用地址是指union内部的各个成员之间,不是说union自己可以不实例化直接使用吧?
我还是觉得你这是误用
引用 12 楼 lgf2002 的回复:
呵呵,你们说的都有道理,但是我这种用法不是没有,这里出错得原因是,在函数内部,且是static的,出了函数,就不会有问题。
我之所以这样用,是为了消除原来代码中的一个警告,想利用union公用地址的特点,进行隐式内型转换。但是又不想在原来代码前都加一个对象,所以想用a类型的变量接收数据,然后用b类型直接去用,这是消除警告的最小改动。

[/Quote]
arong1234 2009-11-27
  • 打赏
  • 举报
回复
共用地址是指union内部的各个成员之间,不是说union自己可以不实例化直接使用吧?
我还是觉得你这是误用
[Quote=引用 12 楼 lgf2002 的回复:]
呵呵,你们说的都有道理,但是我这种用法不是没有,这里出错得原因是,在函数内部,且是static的,出了函数,就不会有问题。
我之所以这样用,是为了消除原来代码中的一个警告,想利用union公用地址的特点,进行隐式内型转换。但是又不想在原来代码前都加一个对象,所以想用a类型的变量接收数据,然后用b类型直接去用,这是消除警告的最小改动。
[/Quote]
lgf2002 2009-11-27
  • 打赏
  • 举报
回复
呵呵,你们说的都有道理,但是我这种用法不是没有,这里出错得原因是,在函数内部,且是static的,出了函数,就不会有问题。
我之所以这样用,是为了消除原来代码中的一个警告,想利用union公用地址的特点,进行隐式内型转换。但是又不想在原来代码前都加一个对象,所以想用a类型的变量接收数据,然后用b类型直接去用,这是消除警告的最小改动。
就呆在云上 2009-11-27
  • 打赏
  • 举报
回复
没有见过
不过g++3.4.6没有问题
或许标准有说?
楼主贴出来看看
arong1234 2009-11-27
  • 打赏
  • 举报
回复
也许这是union的特例吧,除了enum之外,我还真没见过你这种用法。不觉得你这是啥好办法
[Quote=引用 8 楼 lgf2002 的回复:]
我刚才又试了,在GCC 3.4.2版本上,上面是没有问题的,但是,在GCC 3.2上就有问题,不知道它们的规范有何不同,导致问题
另外,匿名union和在union之外定义的一个普通变量具有相同的可见性及作用域,如
{
    int a;
    union
    {
      int a;
      int b;
    };
}
这是不用许的,你可以去试一下

引用 7 楼 arong1234 的回复:
难道又是新标准说法?我理解的匿名union是指union自己没有名字,而不是不定义对象。除了static成员变量,C++从来不允许直接给类型的成员直接赋值。

引用 4 楼 lgf2002 的回复:
呵呵,谢谢2,3楼的,像你那样用,当然没有问题,但是你那就不叫匿名union,我之所以用匿名unoin是因为实际项目中,有很多地方都涉及到比如这里的b,如果加上对象,那么我就得改几十个地方。这里如果不用static的,也不会有问题。但是如果GCC编译选项严格,就有一条规范,匿名union必须是static的,如果不是,就会报warning,这也是不允得


[/Quote]
wgq2633 2009-11-27
  • 打赏
  • 举报
回复
对,就是LS上的说法。
你的static union
{
int c;
int d;
};只是定义了这样一个类型,用class类比的话相当于只定义了一个class A;而没有产生class A类型的变量,所以根本就没有内存的.
union U_A{...} a;它匿名是这样的union{...} a;
lgf2002 2009-11-27
  • 打赏
  • 举报
回复
我刚才又试了,在GCC 3.4.2版本上,上面是没有问题的,但是,在GCC 3.2上就有问题,不知道它们的规范有何不同,导致问题
另外,匿名union和在union之外定义的一个普通变量具有相同的可见性及作用域,如
{
int a;
union
{
int a;
int b;
};
}
这是不用许的,你可以去试一下

[Quote=引用 7 楼 arong1234 的回复:]
难道又是新标准说法?我理解的匿名union是指union自己没有名字,而不是不定义对象。除了static成员变量,C++从来不允许直接给类型的成员直接赋值。

引用 4 楼 lgf2002 的回复:
呵呵,谢谢2,3楼的,像你那样用,当然没有问题,但是你那就不叫匿名union,我之所以用匿名unoin是因为实际项目中,有很多地方都涉及到比如这里的b,如果加上对象,那么我就得改几十个地方。这里如果不用static的,也不会有问题。但是如果GCC编译选项严格,就有一条规范,匿名union必须是static的,如果不是,就会报warning,这也是不允得

[/Quote]

64,652

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧