代码之家  ›  专栏  ›  技术社区  ›  Sydius

通过Perl脚本过滤C++?

  •  3
  • Sydius  · 技术社区  · 15 年前

    我有一个Perl脚本,我想在GCC正常处理它们之前过滤我的cpp/h文件——基本上是作为一个额外的预处理步骤。有简单的方法吗?我意识到我可以将cpp文件提供给脚本,并让gcc从stdin读取输出,但这对头文件没有帮助。

    5 回复  |  直到 15 年前
        1
  •  7
  •   Jonathan Leffler    15 年前

    处理这种过程的经典方法是将源代码(输入到Perl过滤器)视为一种新语言,并使用新的文件后缀。然后你告诉我 make 从这个新文件类型编译C++源文件的方法是用Perl脚本编写的。

    例如:

    • 新后缀: .ccp
    • 新规则(假设 .cc 后缀):

      .ccp.cc:
              ${FILTERSCRIPT} $<
      
    • 在后缀列表中添加新的后缀——优先于普通C++规则。

    最后一点是最棘手的。如果你只是把 中国共产党 列表的后缀,然后 制作 不会真正关注 中国共产党 文件时 CC 文件存在。你要么移除中间物 CC 归档或确保 中国共产党 出现之前 CC 在后缀列表中。(注:如果你写了 .ccp.o '没有a的规则' .ccp.cc '规则和不确保' CC '中介被清除,然后编译失败后重新生成可能意味着 制作 只编译' CC '文件,这可能会令人沮丧和困惑。)

    如果更改后缀不是一个选项,那么编写一个编译脚本来进行过滤,并直接调用C++编译器。

        2
  •  2
  •   anon    15 年前

    C和C++预处理器对这种事情没有任何支持。处理这个问题的唯一方法是让makefile(或其他)在调用编译器之前通过perl脚本处理所有文件。这显然是非常困难的,并且是不设计需要这样一个步骤的体系结构的一个非常好的原因。你在做什么让你觉得你需要这样的设施?可能有一个更好的解决方案你不知道。

        3
  •  2
  •   Andrew Barnett    15 年前

    运行perl脚本然后调用gcc的gcc包装器怎么样?把它叫做plgc和set CC=plgcc 在你的makefile中。您的脚本必须足够聪明才能处理include指令——除非您的脚本只调用预处理器来引入include,执行它的操作,然后调用gcc。

        4
  •  2
  •   Dipstick    15 年前

    GCC允许您使用自己的预处理器。您可以将脚本设置为预处理器,然后通过cpp(正常的gcc预处理器)运行输出。查看gcc手册中的-b和-no集成cpp命令行选项。

    警告-我从来没有尝试过自己,所以不知道它可能是多么混乱(记住,尽管很多年来,包括C语言的许多语言,被实现为C编译器的预处理器,所以支持不应该太坏)。

        5
  •  1
  •   JesperE    15 年前

    我过去处理过这样的案件,我做了如下的事情。这种方法假定可以通过某种命名方案来区分未处理的源代码,在这种情况下,用 _pp .

    # These are your source files to be preprocessed
    SRC_RAW = mysrc_pp.cpp
    
    # These are the source files after preprocessing
    SRC_PP = $(patsubst %_pp.cpp, %.cpp, $(SRC_RAW))
    
    ALL_SRC = $(SRC) main.cpp other.cpp
    
    OBJ = $(patsubst %.cpp, %.o, $(ALL_SRC))
    
    $(SRC): %.cpp: %_pp.cpp 
            $(PERL) $< > $@
    
    $(OBJ): %.o: %.cpp
            $(CXX) ...
    

    但是,这并不能处理您有需要预处理的头文件的情况。在这种情况下,您需要类似的规则来创建它们。