如何将-Wno-unused-private-field添加到一个文件中?

时间:2017-03-23 01:11:58

标签: c++ gnu-make

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

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

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

4 个答案:

答案 0 :(得分:2)

假设您使用的是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;
};

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

最容易想到的答案就是这个。

我不确定$(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

答案 3 :(得分:0)

如果启用了 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() {;}