使用g ++,如何弃用虚拟类成员函数

时间:2010-12-01 21:26:09

标签: c++ linux compiler-construction g++

对于声明为虚拟的函数,我似乎无法将弃用的警告打印出来。 我正在使用“g ++(GCC)4.1.1 20061011(Red Hat 4.1.1-30)。” 我的研究表明gcc 4.x中可能存在关于弃用的问题 纯虚函数(即类bueller {virtual int cameron()= 0;};), 但不是......我猜你会把它们称为常规......虚函数。 就这样我们在同一页上......

foo.h中

class Foo
{
  void Foo_A() __attribute__((deprecated)); //non-virtual
  virtual void Foo_B() __attribute__((deprecated)); //virtual
  virtual void Foo_C() __attribute__((deprecated)) = 0; //pure virtual
};

假设我使用g ++编译了这个foo.cpp文件和一些main.cpp文件。

1)任何使用Foo_A()的东西都会显示警告。

2)任何使用Foo_B()的东西都不会显示警告。

3)任何继承Foo的东西,实现Foo_C然后使用它都不会显示警告。

1号:它有效,没问题。

3号:看起来像一个已知的bug /功能......无论如何......

然而,似乎没有#2的探索。 也许它被排在第3位,虽然我发现没有提到它。

任何人都知道我是否遗漏了有关我想弃用的常规虚拟类成员函数的任何内容?

BTW:我的makefile中没有打开-Wno-deprecate。

3 个答案:

答案 0 :(得分:1)

鉴于此计划:

struct Foo
{
  virtual void Foo_B() __attribute__((deprecated)); //virtual
};

struct DerivedFoo : public Foo
{
};


int main()
{
  DerivedFoo d;
  d.Foo_B();
  Foo &f = d;
  f.Foo_B();
}
void Foo::Foo_B() {}

在CentOS 5.2(gcc版本4.1.2 20080704(Red Hat 4.1.2-44))上,我得到了你描述的相同输出:

g++     deprecate.cc   -o deprecate
deprecate.cc: In function ‘int main()’:
deprecate.cc:14: warning: ‘Foo_B’ is deprecated (declared at deprecate.cc:3)

但是,在Ubuntu 10.04.1(gcc版本4.4.3(Ubuntu 4.4.3-4ubuntu5))上,我得到了你期望的输出:

g++     deprecate.cc   -o deprecate
deprecate.cc: In function ‘int main()’:
deprecate.cc:14: warning: ‘virtual void Foo::Foo_B()’ is deprecated (declared at deprecate.cc:3)
deprecate.cc:16: warning: ‘virtual void Foo::Foo_B()’ is deprecated (declared at deprecate.cc:3)

所以,我猜这是一个修复的编译器错误。

答案 1 :(得分:0)

您是通过Foo指针/引用还是派生类调用Foo_B()/ Foo_C()?如果你使用派生类,你似乎也必须在其中标记已弃用的方法,或者你得到你描述的行为。

答案 2 :(得分:0)

Google在Debian列表中显示了关于此主题的旧版discussion。但最近没有提出这个话题。尝试询问发行版(在本例中为RedHat)列表。