21

我在一个已大量重命名其所有类和函数的框架上工作,我创建了一个允许使用旧名称的转换头:

#define OldClassA NewClassA
#define OldClassB NewClassB
...

现在我希望编译器在使用旧名称时警告用户。我怎样才能做到这一点?

int main(){
  NewClassA newA;
  OldClassA oldA; // <-- This one would emit a warning
}
4

4 回答 4

25

正如其他人所说,这是非常特定于编译器的。假设您的类是用新名称定义的。以下是您可以使用 GCC 和 MSVC 执行的操作:

class NewClassA {}; // Notice the use of the new name.

// Instead of a #define, use a typedef with a deprecated atribute:

// MSVC
typedef NewClassA __declspec(deprecated) OldClassA;

// GCC
//typedef NewClassA __attribute__((deprecated)) OldClassA;

int main(){
    NewClassA newA;
    OldClassA oldA;
}

MSVC 产生:

警告 C4996:“OldClassA”:已宣布弃用

海合会产生:

警告:不推荐使用“OldClassA”

NewClassA newA;任何一个编译器都不会发出警告。

于 2013-07-17T09:58:37.383 回答
8

这可能是高度特定于编译器的。

对于 GCC,http://gcc.gnu.org/onlinedocs/gcc-3.2/gcc/Type-Attributes.html 的参考页面描述了该deprecated属性并提供了typedefs 的示例,我认为这些示例应该适合您的需求:

typedef NewClassA OldClassA __attribute__ ((deprecated));

Clang 有类似的东西,见http://clang.llvm.org/docs/LanguageExtensions.html

对于 Visual C++,您可以尝试它的deprecated声明/编译指示:http: //msdn.microsoft.com/en-us/library/044swk7y (v=vs.80).aspx

于 2013-07-17T09:45:35.183 回答
7

自 C++14 发布以来,您现在可以[[deprecated]]独立于编译器使用该属性(当然,只要编译器完全支持 C++14)。

在您的情况下,您将使用:

[[deprecated]]
typedef NewClassA OldClassA;

// You can also include a message that will show up in the compiler
// warning if the old name is used:

[[deprecated("OldClassA is deprecated; use NewClassA instead.")]]
typedef NewClassA OldClassA;

请注意,这只在 gcc-4.9 中受支持(如果使用 gcc),您需要指定-std=c++1y. 我不了解 MSVC;clang 从 3.4 版开始支持此功能。

请参阅http://josephmansfield.uk/articles/marking-deprecated-c++14.html了解有关如何弃用除 typedef 之外的其他内容的更多详细信息。

于 2015-07-01T19:58:11.230 回答
1

许多编译器支持#warning指令。例如 VS: http: //msdn.microsoft.com/en-us/library/aa266053 (v=vs.60).aspx或 GCC: http: //gcc.gnu.org/onlinedocs/cpp/Diagnostics.html

#warning "old class name is used". 或者在 C++11 中,您可以使用static_assert.

像这样的东西:

#ifdef OldClassA
   #warning "old class name is used"
于 2013-07-17T09:40:33.623 回答