C,弃用struct成员的便携方式

ide*_*n42 5 c struct

使用GCC和Clang,您可以弃用struct成员(如下所示).

但是我没有看到为其他编译器(例如MSVC)执行此操作的方法.

虽然这不是C规范的一部分,并且很可能依赖于每个编译器的pragma或自定义扩展,但是能够在更广泛的编译器中支持它是有用的.

/* mytest.h */
#ifdef __GNUC__
#  define ATTR_DEPRECATED __attribute__((deprecated))
#else
#  define ATTR_DEPRECATED  /* unsupported compiler */
#endif

struct Test {
  int bar;
  int foo  ATTR_DEPRECATED;
};
Run Code Online (Sandbox Code Playgroud)

一旦成员被弃用,编译器应该在直接访问它时警告它的使用,例如:

#include "mytest.h"
static func(void)
{
    Test t;
    t.bar = 1;
    t.foo = 0;  /* <-- WARN ABOUT THIS AT COMPILE TIME */
}
Run Code Online (Sandbox Code Playgroud)

ide*_*n42 2

除了支持 GCC 的编译器__attribute__((deprecated))(例如 Clang)之外,MSVC 没有弃用结构成员的约定(使用 MSVC,您可以弃用标识符,但这适用于全局,而不仅仅是该结构)。

此外,还没有发布其他 C 编译器的其他约定。所以看起来这是 GCC 特有的。