【问题标题】:Does gcc have a pragma to define file type/compiler?gcc 是否有编译指示来定义文件类型/编译器?
【发布时间】:2013-11-05 01:55:00
【问题描述】:

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

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

更新,评论后:

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

【问题讨论】:

  • 显而易见的解决方案是使用 .c 后缀命名 C 文件,使用 .cc 或 .cpp 后缀命名 C++ 文件。我想不出任何理由不使用这样的约定。您的环境中是否有某些东西阻止您这样做?
  • @KeithThompson 我已经更新了这个问题,因为我有太多要写的评论! :-)
  • C++编译器编译的源文件是C++源文件,应该有.cpp或.cc后缀。我知道为更改的文件名更改构建系统是一项艰巨的工作,但我认为这是最好的方法。

标签: c++ c gcc pragma


【解决方案1】:

您提到有一个提示这个问题的构建系统问题。我曾经通过在源文件中使用 cmets 解决了类似的问题。我使用了 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++)

【讨论】:

    【解决方案2】:

    没有。

    The documentation 用于 -x none 选项状态:

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

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

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

    【讨论】:

    • 是的,感觉鸡和蛋,但就我而言,我只在 C 和 C++ 之间切换。所以它是有效的(有点)。我正在尝试回避构建系统问题。
    猜你喜欢
    • 2010-12-03
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 2021-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多