【问题标题】:How can I add -Wno-unused-private-field to just one file?如何将 -Wno-unused-private-field 添加到一个文件中?
【发布时间】:2017-03-23 01:11:58
【问题描述】:

我有一个未使用的私有变量只出现在一个 C++ 源文件中,我不想修复它,因为它将在未来使用,我想知道是否有任何其他文件最终出现此错误,所以我'想将-Wno-unused-private-field 添加到一个源文件的规则中。我如何指示 gnumake 只为一个源文件的编译添加 -Wno-unused-private-field?我有 -Wall 通过 CXXFLAGS 变量进入,我如何向该变量添加另一个值但仅用于一个文件的编译?我也想将其限制在一个平台(Mac)上:

ifeq "$(BUILD_HOST_ARCH_NAME)" "darwin"
CXXFLAGS += -Wno-unused-private-field
endif

但我如何也将其限制为一个文件,foo.cpp

【问题讨论】:

标签: c++ gnu-make


【解决方案1】:

假设你使用的是Clang,你可以在源码中用#pragma控制它:

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-private-field"

class A {
private:
    int unused;
};
#pragma clang diagnostic pop

class B {
private:
    // This still produces a warning
    int unused;
};

【讨论】:

  • #ifdef 是否需要为 gcc 等非 clang 构建绕过编译指示,还是因为不是 clang 编译器而忽略它们?
  • @WilliamKF 也许是的,以避免未知的编译指示/未知选项警告
【解决方案2】:

您可以使用target-specific variable value。连同平台检查,它看起来像这样:

ifeq "$(BUILD_HOST_ARCH_NAME)" "darwin"
foo.o: CXXFLAGS += -Wno-unused-private-field
endif

【讨论】:

    【解决方案3】:

    想到的最简单的答案就是这个。

    我不确定您的 $(BUILD_HOST_ARCH_NAME) 来自哪里。如果您还没有它,那么第一行正在评估它,假设您的 shell 中有一个有效的 uname 命令。这足以将 Darwin 与 Linux 区分开来,但对于 Windows 来说可能还不够。

    BUILD_HOST_ARCH_NAME = $(shell uname -s)
    
    CXXEXTRAFLAGS =
    ifeq "$(BUILD_HOST_ARCH_NAME)" "Darwin"
    CXXEXTRAFLAGS += -Wno-unused-private-field
    endif
    
    foo.o: foo.cpp
        $(CXX) $(CXXFLAGS) $(CXXEXTRAFLAGS) $< -o $@
    
    %.o: %.cpp
        $(CXX) $(CXXFLAGS) $< -o $@
    

    然后,在 Mac 上:

    $ make -n foo.o
    c++   -Wno-unused-private-field foo.cpp -o foo.o
    $ make -n bar.o
    c++  bar.cpp -o bar.o
    

    【讨论】:

      【解决方案4】:

      如果启用了 C++17 并且您需要将其应用于严格数量的文件,则可以使用 [[maybe_unused]]

      #include <cassert>
       
      [[maybe_unused]] void f([[maybe_unused]] bool thing1,
                              [[maybe_unused]] bool thing2)
      {
         [[maybe_unused]] bool b = thing1 && thing2;
         assert(b); // in release mode, assert is compiled out, and b is unused
                    // no warning because it is declared [[maybe_unused]]
      } // parameters thing1 and thing2 are not used, no warning
       
      int main() {;}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-04-01
        • 1970-01-01
        • 2023-04-09
        • 2013-06-10
        • 1970-01-01
        • 2013-03-12
        • 1970-01-01
        相关资源
        最近更新 更多