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

时间:2014-04-02 21:29:07

标签: c struct

GCC&您可以弃用struct成员,(如下所示)。

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

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

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

struct Test {
  int bar;
  int foo  ATTR_DEPRECATED;
};

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

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

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

简单地说,这里没有任何单向适合的东西。有些编译器根本不支持这样的想法。我会根据this提出一些建议,但在此处重复(经过一些修改):

#ifdef __GNUC__
   #define ATTR_DEPRECATED __attribute__((deprecated))
#elif defined _MSC_VER
   //List of deprecated values
   #pragma deprecated(values)
#endif

不幸的是,对于每个弃用的成员,这需要#pragma行,但是嘿。 另外,正如思想家在评论中指出的那样,deprecated编译指示是全局的,所以如果你的结构成员在任何地方都有一个同名的实例,那么它将被标记。

答案 2 :(得分:1)

也许更重要的是:

#ifdef __GNUC__
    #define DEPRECATED(x) x __attribute__((deprecated))
#elif defined _MSC_VER
    #define DEPRECATED(x) __pragma deprecated(x)
#else
    #define DEPRECATED(x) x
#endif

编辑:这是基于Quirliom的回答 第二次编辑:将#pragma修改为__pragma,如ideasman42

所示

答案 3 :(得分:-1)

如果所有已弃用的结构成员都具有该结构唯一的名称,则可以将该结构替换为包含包含实际值但略有不同名称的结构数组的结构,然后使用{{1创建定义所有结构元素的宏。

例如,如果旧结构是:

#define

可以用以下代码替换它:

typedef struct {
  int FOO_first;
  int FOO_second;
  long FOO_third;
} FOO;

不幸的是,如果任何弃用的项目的名称被用作任何其他目的的标识符,我不知道如何使该技术在C中起作用。