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

问题描述 投票:0回答:3

对于声明为虚拟的函数,我似乎无法打印出不推荐使用的警告。 我使用的是“g++ (GCC) 4.1.1 20061011 (Red Hat 4.1.1-30)”。 我的研究表明 gcc 4.x 中可能存在关于弃用的问题 纯虚函数(即 class 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 然后使用它的东西都不会显示警告。

第一:它可以工作,没问题。

数字 3:似乎是一个已知的错误/功能..无论如何..

然而,#2 似乎没有任何解释。 也许它与#3有关,尽管我没有发现任何提及它的内容。

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

顺便说一句:-Wno-deprecate 在我的 makefile 中没有打开。

c++ linux g++
3个回答
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)

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


0
投票

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.