【问题标题】:g++ flag to only check syntax?g++ 标志只检查语法?
【发布时间】:2015-02-08 13:11:40
【问题描述】:

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

看起来gcc 5 将有-Wc90-c99-compat-Wc99-c11-compat,那个方向的东西。

【问题讨论】:

  • 我认为这样的开关对 C++ 的作用不如对 C 的作用。C++03 和 C++11 之间的区别不仅限于语法,还有提供标准库头文件、类和函数的主要区别。诚然,这对 C 来说也是一个问题,但没有那么大。
  • “较新的优化或技巧”是什么意思?该标准不会阻止在您希望源代码格式正确的 C++98 的规定约束内进行任何优化

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


【解决方案1】:

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

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

您可以做到这一点的最有效方法可能是在 以下几行:

.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 时,会导致 整个编译器的行为就像是 g++ 2.x。不是这样。它仍然是 g++ 4.x,带有 g++ 4.x优化技术等,按照C++98的语言定义操作。

如果您的代码由于某种原因必须通过,这肯定是有道理的, 作为 C++98,在一些比您的发布编译器更旧的编译器上,在这种情况下,您 需要区分makefile中的编译器。但显然这不是 案子。你也可以用-std=C++98进行常规编译

【讨论】:

  • 谢谢,这是一个聪明的做法。我不想需要更新的编译器,这就是我不想坚持通用语言集的原因。但是强制 -std=XXX 禁止 g++ 做一些优化等等。我会这样做:只使用 98 执行语法,然后真正编译时不使用 -std=。
猜你喜欢
  • 2015-11-19
  • 1970-01-01
  • 2011-06-28
  • 2020-10-17
  • 1970-01-01
  • 1970-01-01
  • 2015-08-16
  • 2018-08-14
  • 1970-01-01
相关资源
最近更新 更多