g++ 标志只检查语法?
g++ flag to only check syntax?
有没有办法让 g++ 在编译时检查 C++98 语法,但同时编译时就好像没有给出 -std=
一样?我的目标是确保我的源代码保持 C++98,但我不想阻止 g++ 使用任何更新的优化或技巧。目前,我编译了我的项目两次,一次使用 CXXFLAGS=-std=c++98
,一次使用最终的空 CXXFLAGS
进行发布。
看起来 gcc 5 会有 -Wc90-c99-compat
和 -Wc99-c11-compat
,那个方向的东西。
你将必须运行编译两次,但你可以节省编译时间
在 -std=c++98
通过并通过仅指定语法检查来避免生成不需要的目标文件。你这样做
传递选项 -fsyntax-only
.
您还需要修改 make
以跳过 C++98 的 linkage,因为 link.
没有任何内容
可能最有效的方法是使用 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++ 源代码,因此不会对源代码进行第二次预处理。
代码只预处理一次,目标代码只生成一次。
link年龄如常。如果 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 说时,会导致
整个编译器的行为就好像是 g++ 2.x。不是这样。它仍然是 g++ 4.x,与
g++ 4.x优化技术等,按C++98的语言定义运行即可。
如果您的代码出于某种原因必须通过,那肯定有一点意义,
作为 C++98,在一些 比你的发布编译器更旧 的编译器上,在那种情况下你
需要在 makefile 中区分编译器。但显然这不是
案件。您也可以使用 -std=C++98
进行常规编译
有没有办法让 g++ 在编译时检查 C++98 语法,但同时编译时就好像没有给出 -std=
一样?我的目标是确保我的源代码保持 C++98,但我不想阻止 g++ 使用任何更新的优化或技巧。目前,我编译了我的项目两次,一次使用 CXXFLAGS=-std=c++98
,一次使用最终的空 CXXFLAGS
进行发布。
看起来 gcc 5 会有 -Wc90-c99-compat
和 -Wc99-c11-compat
,那个方向的东西。
你将必须运行编译两次,但你可以节省编译时间
在 -std=c++98
通过并通过仅指定语法检查来避免生成不需要的目标文件。你这样做
传递选项 -fsyntax-only
.
您还需要修改 make
以跳过 C++98 的 linkage,因为 link.
可能最有效的方法是使用 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++ 源代码,因此不会对源代码进行第二次预处理。
代码只预处理一次,目标代码只生成一次。
link年龄如常。如果 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 说时,会导致
整个编译器的行为就好像是 g++ 2.x。不是这样。它仍然是 g++ 4.x,与
g++ 4.x优化技术等,按C++98的语言定义运行即可。
如果您的代码出于某种原因必须通过,那肯定有一点意义,
作为 C++98,在一些 比你的发布编译器更旧 的编译器上,在那种情况下你
需要在 makefile 中区分编译器。但显然这不是
案件。您也可以使用 -std=C++98