GCC根据文件扩展名(.c,.cc),命令行参数(-x)或直接调用适当的编译器(g ++而不是gcc)自动在编译器之间切换。
有没有办法在文件中使用pragma覆盖它们?
评论后更新:
我正在转换目前为50/50 C&的代码库。 C ++完全用C ++编译器编译。这是为了允许当前的“C”模块调用一个我无法改变的新C ++基础(并且不希望换行)。我想将扩展名保持为.c以获取真正为C的文件,即使它们现在具有C ++链接。我认为将它们保留为“.c”表示它们为何如此(我在想这里的后代!;-))但是更改构建系统以适应每个更改的C文件名也是一项大工作。更糟糕的是,一小部分C文件不能很好地转换为C ++,所以如果他们不调用C ++基础我想把它们留作C.重写它们不是一个选择,但稳定性的风险该项目太棒了。
答案 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
选项的
关闭语言的任何规范,以便后续文件根据其文件名后缀进行处理(因为如果没有使用-x则它们是如此)。
所以,没有提到进一步的机制,这使我得出结论它们不存在。
另请注意,您的想法包含一个逻辑问题:#pragma
是某些语言的一项功能,因此使用它来指定正在使用的语言非常鸡奸。