c++ - g++ 标志只检查语法?

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

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

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

最佳答案

必须运行编译器两次,但您可以节省编译时间 在 -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 语法检查 channel , 这不会产生新文件。

空的 %.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 给出 say 时,会导致 整个编译器的行为就好像是 g++ 2.x。不是这样。它仍然是 g++ 4.x,与 g++ 4.x优化技术等,仅按C++98语言定义运行。

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

进行常规编译

关于c++ - g++ 标志只检查语法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28394286/

相关文章:

c++ - 我可以使用 C++ 模板生成函数的 Unicode/ANSI 变体,而不是使用预处理器吗?

c++ - 为什么/etc/目录下没有创建文件

c++ - c++11标准中关于可变参数模板的困惑

linux - 使用 boost 和 C++11 构建进程崩溃

c++ - -fno-exceptions 对于某些库?

c++ - 删除注册表键值

c++ - 使用 windows.h 时 undefined reference

c++ - QVector<int> 写入/调整大小性能

c++ - 关于在 C++ 中将数组存储在 std::vector 中的问题

如果我不使用 Code::Blocks 但使用 cygwin 进行编译,c++ compare std::string 将不起作用