gcc是否有一个pragma来定义文件类型/编译器?

时间:2013-11-01 14:36:08

标签: c++ c gcc pragma

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

有没有办法在文件中使用pragma覆盖它们?

评论后更新:

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

2 个答案:

答案 0 :(得分: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=gcc还是CC=g++)< / p>

答案 1 :(得分:1)

没有

-x none选项的

The documentation表示:

  

关闭语言的任何规范,以便后续文件根据其文件名后缀进行处理(因为如果没有使用-x则它们是如此)。

所以,没有提到进一步的机制,这使我得出结论它们不存在。

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