5

GCC 会根据文件扩展名(.c、.cc)、命令行参数(-x)或直接调用适当的编译器(例如,g++ 而不是 gcc)自动在编译器之间切换。

有没有办法使用文件内的编译指示覆盖这些?

更新,评论后:

我正在将当前为 50/50 C & C++ 的代码库转换为完全使用 C++ 编译器编译。这是为了允许当前的“C”模块调用我无法更改(并且不希望包装)的新 C++ 基础。对于真正是 C 的文件,我想将扩展名保留为 .c,即使它们现在具有 C++ 链接。我认为将它们保留为“.c”表明它们为何保持原样(我在这里考虑后代!;-))但更改构建系统以适应每个更改的 C 文件名也是一项艰巨的工作。更糟糕的是,一小部分 C 文件不会完全转换为 C++,因此如果它们不调用 C++ 基础,我想将它们保留为 C。但重写它们不是一种选择,稳定性的风险项目太大了。

4

2 回答 2

2

你提到有一个提示这个问题的构建系统问题。我曾经通过在源文件中使用注释解决了类似的问题。我使用了 Makefile 规则,例如:

%.o: %.c
        $(CC) $(CFLAGS) `if head -1 $< | grep -q 'C++'; then echo '-x c++'; else echo '-x c'; fi` -c -o $@ $<

现在,如果源文件以注释行开头,例如/* C++ */它将被编译为 C++,否则它将被编译为 C(无论是否CC=gccCC=g++

于 2013-11-01T17:46:54.993 回答
1

不。

该选项的文档-x none指出:

关闭任何语言规范,以便根据文件名后缀处理后续文件(就像根本没有使用 -x 时一样)。

因此,没有提及进一步的机制,这使我得出结论,它们不存在。

另请注意,您的想法包含一个逻辑问题:#pragma是某些语言的特性,因此使用它来指定正在使用的语言是非常鸡和蛋的。

于 2013-11-01T14:41:02.187 回答