g ++标志只检查语法?

时间:2015-02-08 13:11:40

标签: c++ c++11 g++ c++98

有没有办法在编译时对C ++ 98语法进行g ++检查,但同时编译好像没有给出-std=?我的目标是确保我的源代码保持C ++ 98,但我不想阻止g ++使用任何更新的优化或技巧。目前,我编译我的专业版两次,一次是CXXFLAGS=-std=c++98,一次是最后一次空CXXFLAGS

看起来gcc 5会有-Wc90-c99-compat-Wc99-c11-compat,这就是那个方向。

1 个答案:

答案 0 :(得分:4)

必须运行编译器两次,但是你可以节省编译时间 在-std=c++98传递上,通过仅指定语法检查来避免生成不需要的对象文件。你做到了 传递选项-fsyntax-only

您还需要修改make以跳过C ++ 98的链接,因为没有任何内容可以链接。

可能最有效的方法是使用make 以下几行:

.phony: all clean

SRCS = foo.cpp
FLAT_SRCS = $(patsubst %.cpp,%.ii,$(SRCS))
OBJS = $(patsubst %.ii,%.o,$(FLAT_SRCS))

%.ii: %.cpp
    g++ -std=c++98 $(CPPFLAGS) -E $< > $@ && g++ -std=c++98 -fsyntax-only $@

%.o: %.cpp
%.o: %.ii
    g++ -c -o $@ $(CPPFLAGS) $(CXXFLAGS) $<


all: foo

foo: $(OBJS) 
    g++ -o $@ $(CXXFLAGS) $(LDFLAGS) $(OBJS) $(LDLIBS)

clean:
    rm -f $(OBJS) $(FLAT_SRCS) foo

此处,%.ii: %.cpp规则首先将.cpp预处理为.ii, 然后将已经预处理的源传递给C ++ 98语法检查传递, 它不会产生新文件。

%.o: %.cpp规则会覆盖隐含的规则 导致.cpp编译为.o,并将其替换为%.o: %.ii 规则编译.ii。 g ++将.ii识别为已经预处理的表示 C ++源代码,因此它不会再次预处理源。

代码仅预处理一次,目标代码仅生成一次。

联系与往常一样。如果C ++ 98语法检查通过,make将如下所示:

$ make
g++ -std=c++98  -E foo.cpp > foo.ii && g++ -std=c++98 -fsyntax-only foo.ii
g++ -c -o foo.o   foo.ii
g++ -o foo   foo.o 
rm foo.ii

您需要注意make会自动删除预处理的.ii,这很好: 它只是.cpp.o之间的渠道。

所有这一切,我支持@Matt McNabb的观察,你没有任何意义 得到这个!鉴于您的代码 C ++ 98,编译器不会更好地优化它 当被指示必须是C ++ 98而不是。到时候GCC到了 它的业务优化阶段,它不再关心什么样的源代码 它始于。

你可能会认为-std=c++98,当给予g ++ 4.x时,会导致。{1}} 整个编译器表现得好像是g ++ 2.x.不是这样。它仍然是g ++ 4.x,而且 g ++ 4.x优化技术等,只是按照C ++ 98的语言定义进行操作。

如果您的代码由于某种原因必须通过,那肯定会有一点意义, 作为C ++ 98,在一些较旧的编译器上比你的发布编译器,在这种情况下你 需要区分makefile中的编译器。但显然这不是 案件。您也可以使用-std=C++98

进行常规编译