

`-Werror`
でプロジェクトをコンパイルしていて、DeprecatedなHeaderOnlyLibraryのために全体のエラー抑止はしたくないのですが、このライブラリに対してだけ抑止するにはどのようにすべきですか？
gcc, clang, msvc 共通で使えるような方法はありますか？

例：

deprecated.hpp

[code]

    volatile int b = 0;
    
    void a(){
        b+=1;
    }
    
[/code]

main.cpp

[code]

    #include "deprecated.hpp"
    
    int main(){
        a();
        return 0;
    }
    
[/code]

コンパイル時のエラー表示:

[code]

    $ g++ main.cc -Wall -Wextra -Werror -std=gnu++2b
    
    deprecated.hpp: In function 'void a()':
    deprecated.hpp:4:6: error: compound assignment with 'volatile'-qualified left operand is deprecated [-Werror=volatile]
        4 |     b+=1;
          |     ~^~~
    cc1plus: all warnings being treated as errors
    
[/code]


CC BY-SA 4.0
2021-02-23T05:26:55.040
74220
2021-02-23T12:18:35.883
2021-02-23T06:40:11.790
3060
37013
question
c++
-Werror でコンパイルしたいとき、Header-only library 内のコードがDeprecatedなものを含む場合はどのように対処すべきですか？


Deprecatedな の意図がよくつかめませんでしたが、`deprecated.hpp`がシステムヘッダーなのであれば`#include
<deprecated.hpp>`と記述し、そうでないのであれば`deprecated.hpp`を修正するのがよいかと。

コンパイラーはシステムヘッダーと通常のヘッダーを明確に区別します。前者は`#include <filename>`ですが、後者は`#include
"filename"`となります。  
その上で、GCCはシステムヘッダーであれば、プログラマの制御下にないとして警告を抑止します（[`-Wsystem-
headers`](https://gcc.gnu.org/onlinedocs/gcc-10.2.0/gcc/Warning-
Options.html#index-Wsystem-
headers)で警告を有効化できます）。MSVCも[`/external:anglebrackets`](https://devblogs.microsoft.com/cppblog/broken-
warnings-theory/)でシステムヘッダーに対する警告を抑止できます。


CC BY-SA 4.0
2021-02-23T06:30:34.003
74222
2021-02-23T06:30:34.003
4236
74220
answer


プリプロセッサディレクティブで一時的に警告を無効化する方法があります。

[code]

    // Clang でも __GNUC__ は定義される。
    #if defined(__clang__)
    #pragma clang diagnostic push
    #pragma clang diagnostic ignored "-Wdeprecated-volatile"
    #elif defined(__GNUC__)
    #pragma GCC diagnostic push
    #pragma GCC diagnostic ignored "-Wvolatile"
    #elif defined(_MSC_VER)
    #pragma warning(push)
    //#pragma warning(disable: xxxx)
    #endif
    
    #include "hoge.hpp"
    
    #if defined(__clang__)
    #pragma clang diagnostic pop
    #elif defined(__GNUC__)
    #pragma GCC diagnostic pop
    #elif defined(_MSC_VER)
    #pragma warning(pop)
    #endif
    
[/code]

そのほか、GCC/Clangでは`-Wno-error`を使うことで、`-Werror`を指定していてもエラーではなく常に警告扱いにできます。

  * Clang: `-Wno-error=deprecated-volatile`
  * GCC: `-Wno-error=volatile`

MSVCの`/WX`を部分的に打ち消して特定の番号だけ警告扱いにする方法があるかどうかは不明です。

MSVCに関しては以下のリファレンスを参照してください。

  * [warning pragma | Microsoft Docs](https://docs.microsoft.com/en-us/cpp/preprocessor/warning)
  * [/w, /W0, /W1, /W2, /W3, /W4, /w1, /w2, /w3, /w4, /Wall, /wd, /we, /wo, /Wv, /WX (Warning level) | Microsoft Docs](https://docs.microsoft.com/en-us/cpp/build/reference/compiler-option-warning-level)

いずれにせよ、ユーザーコードであれば、警告を無視せずに修正することを強く推奨します。


CC BY-SA 4.0
2021-02-23T12:18:35.883
74231
2021-02-23T12:18:35.883
15413
74220
answer