我想删除一个C头,这样如果有人在代码中包含了它,编译器就会发出警告。我知道我可以反对使用单个符号,例如,使用c14 [[deprecated]] ,但标题是否也有类似的情况?也许是聪明的把戏?注意,我希望编译器发出警告,即使用户没有使用头中的任何内容。
[[deprecated]]
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 触发不推荐使用的警告。请注意,我将这两个变量都放在匿名名称空间中,以避免可能的名称冲突。不过,如注解中所述,如果在同一个编译单元中,匿名命名空间中声明了一个同名的变量,则仍然可能发生名称冲突。由于这个原因,正如注解中所建议的,上面代码中的变量有一个描述性的名称,使得名称冲突的可能性很小。
badheader_hpp_is_deprecated
please_dont_use_badheader_hpp
mcdcgff02#
我建议用一个名称和名称相同的名称空间包围您的名称空间 using 它从封闭的命名空间中删除。
using
# pragma once namespace your_namespace { namespace [[deprecated]] your_namespace { // old stuff } using namespace your_namespace; }
这不应该用以下内容污染您的全局命名空间: your_namespace 如果包含标题,仍然会发出警告。旧的东西仍然可以通过 your_namespace:: 和以前一样。由于这是一个破坏abi的更改,如果您在弃用标题时还没有修改过库的主要版本,我建议您也修改库的主要版本。
your_namespace
your_namespace::
wn9m85ua3#
非标准但相当便携的解决方案:
# pragma message("Header `foo.h` is deprecated!")
gcc、clang和msvc都接受这一点。gcc和clang也接受不带 ( ) .这不一定是“警告”,但应该足够好。
( )
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!")
使用编译器资源管理器进行尝试。
falq053o5#
如果您的头具有名称空间,则可以使用 [[deprecated]] 我想是吧?但这在匿名名称空间上不起作用。用户必须使用来自顶部空间的东西才能工作。如果您可以将头放在名称空间中,那么您所要做的就是有一个 using 将触发警告的语句。如果这是一个目标的话,这也是一个隔离这些功能并确保用户使用它有更多困难的好主意。
namespace [[deprecated]] N { struct S { }; } using N::S;
但是如果您负担不起名称空间,根据元素的数量,您可能不想使用 using 在所有的人身上。也许这就是合法拥有 using namespace N; ,但我不确定。。。经过一些研究,你可以使用 #pragma message "Message" 也可能达到你似乎想要的。看到这个答案了吗门闩
using namespace N;
#pragma message "Message"
5条答案
按热度按时间vlurs2pr1#
这里有一个可能的解决方案(尽管可能不太优雅)。
在标题中插入这样的代码
这将创建一个不推荐使用的变量
badheader_hpp_is_deprecated
. 初始化please_dont_use_badheader_hpp
触发不推荐使用的警告。请注意,我将这两个变量都放在匿名名称空间中,以避免可能的名称冲突。不过,如注解中所述,如果在同一个编译单元中,匿名命名空间中声明了一个同名的变量,则仍然可能发生名称冲突。由于这个原因,正如注解中所建议的,上面代码中的变量有一个描述性的名称,使得名称冲突的可能性很小。mcdcgff02#
我建议用一个名称和名称相同的名称空间包围您的名称空间
using
它从封闭的命名空间中删除。这不应该用以下内容污染您的全局命名空间:
your_namespace
如果包含标题,仍然会发出警告。旧的东西仍然可以通过your_namespace::
和以前一样。由于这是一个破坏abi的更改,如果您在弃用标题时还没有修改过库的主要版本,我建议您也修改库的主要版本。
wn9m85ua3#
非标准但相当便携的解决方案:
gcc、clang和msvc都接受这一点。gcc和clang也接受不带
( )
.这不一定是“警告”,但应该足够好。
zengzsys4#
这是从range-v3库中无耻地复制的:
使用编译器资源管理器进行尝试。
falq053o5#
如果您的头具有名称空间,则可以使用
[[deprecated]]
我想是吧?但这在匿名名称空间上不起作用。用户必须使用来自顶部空间的东西才能工作。如果您可以将头放在名称空间中,那么您所要做的就是有一个
using
将触发警告的语句。如果这是一个目标的话,这也是一个隔离这些功能并确保用户使用它有更多困难的好主意。但是如果您负担不起名称空间,根据元素的数量,您可能不想使用
using
在所有的人身上。也许这就是合法拥有using namespace N;
,但我不确定。。。经过一些研究,你可以使用
#pragma message "Message"
也可能达到你似乎想要的。看到这个答案了吗门闩