从GCC3.2到GCC3.4遇到的问题

本文分析了从RH8GCC3.2环境迁移到CentOS4.4GCC3.4环境中遇到的编译问题。重点讨论了模板继承及特例化、宏定义引发的语法错误,并提供了相应的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 
最近由于考虑到项目的安全性能问题。打算把在RH8 GCC3.2环境的项目移植到CentOS4.4 GCC3.4环境上,在编译的过程当中发现了很多问题。原来在GCC3.2可以顺利通过编译的语法在GCC3.4上会报错误和警告,下面是遇到的问题,以及如何解决方案,拿出来与大家分析一下。
 
1.       模板的继承
a)         Code:
template < class Msg >
class Base{
……………………
       Threads::Mutex myMutex;
…………………….
}
template <class Msg> class Fifo : public Base<Msg>
{
public:   
…………………..
       int error = myCondition.wait(&myMutex, relativeTimeout);
………………………
}
 
GCC 3.2编译通过,GCC3.4有errro
error: `myMutex' was not declared in this scope
 
对这点,我有点晕,为什么会报错呢?找了很多C++参考书籍也没有这方面特别的说明,我认为关节点在Base<Msg1> 和Base<Msg2>是不是一个类型,按照<<The C++ Programming Language 3rd>>.这两个之间没有关系。这只是我个人的看法。解决的办法是在sub class template里面申明一下父类的成员。
       Using Base<Msg>::myMutex;
       或者在myMutex之前加一个this指针。
       This->myMutex.
 
b)        Code:
    struct hash< Def>
{
       //
};
 
GCC3.4报错:
error: an explicit specialization must be preceded by 'template <>'
 
看来GCC的高版本对语法的检测很严格,对于模板的特例化,要在前面加template<>
 
 
2.       语法:
a)         #define DEF(x)
Struct {
       X* a;
       Int lenth;
}
              Typedef DEF(void) VOID_TYPE
………………………………………
                     Struct functionArray{
                     Int (void * fun)(void *p,int parscoutn);
                     VOID_TYPE (void* fun2)(void* p,int pars);
……………………………………………
}
 
       error:`VOID_TYPE' declared as function returning a function
 
              这的地方我始终没有搞明白为什么抱错,我通过测试传值给它判断它的类型,结果发现编译器把VOID_TYPE (void* fun2)(void*p,int pars)当作void VOID_TYPE(void*)(…..) 处理了,本来VOID_TYPE是fun2指针的返回类型。结果给当作成了函数了。可是这个代码是GCC 3.2是通过的。
       修改的办法如下:
       Struct {
       Void * a;
       Int lenth;
}     VOID_TYPE;
…………………
Struct functionArray{
                     Int (void * fun)(void *p,int parscoutn);
                     Struct VOID_TYPE (void* fun2)(void* p,int pars);
……………………………………………
}
 
编译通过。
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值