我如何能贬低一个C++头?

uplii1fm  于 2021-08-20  发布在  Java
关注(0)|答案(5)|浏览(248)

我想删除一个C头,这样如果有人在代码中包含了它,编译器就会发出警告。
我知道我可以反对使用单个符号,例如,使用c
14 [[deprecated]] ,但标题是否也有类似的情况?也许是聪明的把戏?
注意,我希望编译器发出警告,即使用户没有使用头中的任何内容。

vlurs2pr

vlurs2pr1#

这里有一个可能的解决方案(尽管可能不太优雅)。
在标题中插入这样的代码

// badheader.hpp
namespace {
[[deprecated("This header is deprecated")]]
constexpr static int badheader_hpp_is_deprecated = 0;
constexpr static int please_dont_use_badheader_hpp = badheader_hpp_is_deprecated;
}

这将创建一个不推荐使用的变量 badheader_hpp_is_deprecated . 初始化 please_dont_use_badheader_hpp 触发不推荐使用的警告。请注意,我将这两个变量都放在匿名名称空间中,以避免可能的名称冲突。不过,如注解中所述,如果在同一个编译单元中,匿名命名空间中声明了一个同名的变量,则仍然可能发生名称冲突。由于这个原因,正如注解中所建议的,上面代码中的变量有一个描述性的名称,使得名称冲突的可能性很小。

mcdcgff0

mcdcgff02#

我建议用一个名称和名称相同的名称空间包围您的名称空间 using 它从封闭的命名空间中删除。


# pragma once

namespace your_namespace {
    namespace [[deprecated]] your_namespace {
        // old stuff
    }
    using namespace your_namespace;
}

这不应该用以下内容污染您的全局命名空间: your_namespace 如果包含标题,仍然会发出警告。旧的东西仍然可以通过 your_namespace:: 和以前一样。
由于这是一个破坏abi的更改,如果您在弃用标题时还没有修改过库的主要版本,我建议您也修改库的主要版本。

wn9m85ua

wn9m85ua3#

非标准但相当便携的解决方案:


# pragma message("Header `foo.h` is deprecated!")

gcc、clang和msvc都接受这一点。gcc和clang也接受不带 ( ) .
这不一定是“警告”,但应该足够好。

zengzsys

zengzsys4#

这是从range-v3库中无耻地复制的:


# ifdef __GNUC__

# define RANGES_PRAGMA(X) _Pragma(#X)

# define RANGES_DEPRECATED_HEADER(MSG) RANGES_PRAGMA(GCC warning MSG)

# elif defined(_MSC_VER)

# define RANGES_STRINGIZE_(MSG) #MSG

# define RANGES_STRINGIZE(MSG) RANGES_STRINGIZE_(MSG)

# define RANGES_DEPRECATED_HEADER(MSG) \

    __pragma(message(__FILE__ "(" RANGES_STRINGIZE(__LINE__) ") : Warning: " MSG))

# endif

RANGES_DEPRECATED_HEADER("Yikes! A deprecated header!")

使用编译器资源管理器进行尝试。

falq053o

falq053o5#

如果您的头具有名称空间,则可以使用 [[deprecated]] 我想是吧?但这在匿名名称空间上不起作用。用户必须使用来自顶部空间的东西才能工作。
如果您可以将头放在名称空间中,那么您所要做的就是有一个 using 将触发警告的语句。如果这是一个目标的话,这也是一个隔离这些功能并确保用户使用它有更多困难的好主意。

namespace [[deprecated]] N {
    struct S {

    };
}

using N::S;

但是如果您负担不起名称空间,根据元素的数量,您可能不想使用 using 在所有的人身上。也许这就是合法拥有 using namespace N; ,但我不确定。。。
经过一些研究,你可以使用 #pragma message "Message" 也可能达到你似乎想要的。看到这个答案了吗
门闩

相关问题