有没有办法创建具有通用属性的名称空间? 我知道下面的源代码不是有效的C++代码,只是为了说明我的问题: #include <iostream> namespace mylib { using deprecated = [[deprecated]]; } [[mylib::deprecated]] void deprecated_function() { std::cout << "Calling deprecated function!" << std::endl; } int main(void) { deprecated_function(); return 0; }

有没有办法创建具有通用属性的名称空间? 我知道下面的源代码不是有效的C++代码,只是为了说明我的问题: #include <iostream> namespace mylib { using deprecated = [[deprecated]]; } [[mylib::deprecated]] void deprecated_function() { std::cout << "Calling deprecated function!" << std::endl; } int main(void) { deprecated_function(); return 0; },c++,c++14,C++,C++14,我目前的解决方案是使用#定义属性的位置,例如: // mylib-config.hpp #if __cplusplus > 201402L #define mylib_DEPRECATED [[deprecated]] #elif defined(__clang) #define mylib_DEPRECATED [[clang::deprecated]] #elif defined(__GNUC__) #define mylib_DEPRECATED [[gn

我目前的解决方案是使用
#定义属性的位置,例如:

// mylib-config.hpp
#if __cplusplus > 201402L
    #define mylib_DEPRECATED [[deprecated]]

#elif defined(__clang)
    #define mylib_DEPRECATED [[clang::deprecated]]

#elif defined(__GNUC__)
    #define mylib_DEPRECATED [[gnu::deprecated]]

#else
    #define mylib_DEPRECATED
#endif

// mylib.hpp
mylib_DEPRECATED void deprecated_function();

如果确实可以在自己的命名空间中规范化应用程序使用的所有属性,那么如何解释某些编译器上缺少特定属性的原因?(例如,仅适用于GCC但在其他工具链上不需要的属性)。

否您不能将属性放在名称空间中,也不能将它们与名称空间关联。只需定义一个宏。将定义放在一个标题中,这样不同的编译器将选择该标题的不同、合适的版本。

这正是我现在正在应用的解决方案,我只是想知道我是否忽略了标准中允许我上下文化属性的任何内容。如果是这样的话,我认为属性说明符到目前为止并没有对当前依赖于编译器的属性提供任何真正的改进(或者至少在大多数编译器都有良好的C++17支持之前,未知属性只是被忽略了)。顺便说一句,你认为委员会有可能添加“用户名称空间”属性说明符吗?@FlávioLisbôa:我不知道,但看看()。也许你可以问下面列出的一组人。
// mylib-config.hpp
#if __cplusplus > 201402L
    #define mylib_DEPRECATED [[deprecated]]

#elif defined(__clang)
    #define mylib_DEPRECATED [[clang::deprecated]]

#elif defined(__GNUC__)
    #define mylib_DEPRECATED [[gnu::deprecated]]

#else
    #define mylib_DEPRECATED
#endif

// mylib.hpp
mylib_DEPRECATED void deprecated_function();