【问题标题】:is there a way to prepend code through the command line of a compiler?有没有办法通过编译器的命令行预先添加代码?
【发布时间】:2016-09-09 17:13:38
【问题描述】:

假设我有这个:

int main() { return a; }

我想调用编译器并让它编译:

g++ a.cpp --PREPEND-CODE-FLAG="int a = 5;"

有没有办法做到这一点?

请注意,我知道我可以通过命令行为 a 插入预处理器定义,但我正在寻找一种将真正的 C++ 代码添加到当前翻译单元的方法。

目前,我正在使用该代码生成一个单独的标头,并将其与 g++/clang 的 -I 标志一起包含

【问题讨论】:

  • 没有“当前翻译单元”,因为您可以将多个文件传递给编译器的调用
  • 这个的用例是什么?
  • @Ben 相信我 - 有一个。我正在尝试通过构建系统解决my librarythis 问题(请注意,它不仅适用于Visual Studio - 它会影响所有平台和编译器)。我想要一种非侵入式的方式将静态库的每个目标文件强制链接到最终的 dll/可执行文件中 - 我希望它在 cmake 中编码。
  • 在cmake中,使用configure_file命令...

标签: c++ visual-c++ g++ clang


【解决方案1】:

您已使用与不同 C++ 实现相关的多个标签标记此问题,这表明您正在寻找跨平台解决方案。不存在。

该标准没有指定如何将翻译单元传递给编译器;例如,它从不假定翻译单元是单个文件。如果您在标准 shell 中使用g++,例如,您可以通过执行多个命令来组成一个翻译单元:

{
   echo 'int a = 5';
   echo '#line 1 a.cpp'
   cat a.cpp
} | g++ -Wall -x c++ - 

这适用于 Unix 平台上可用的大多数 C++ 编译器(有细微的变化),但显然不适合 Windows 平台。也许其他事情会是这样。但是,无论您使用什么解决方案,都将针对您工作的环境单独设计。

【讨论】:

  • 我接受这个是因为......因为我怀疑我正在寻找的东西不存在。
【解决方案2】:
$ g++ -DPREPENDED_CODE="int a = 5;" nod.cpp
$ ./a.out
$ echo $?
5
$

nod.cpp 在哪里:

PREPENDED_CODE

int main()
{
    return a;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-22
    • 1970-01-01
    • 2020-10-16
    • 1970-01-01
    • 1970-01-01
    • 2021-08-30
    • 1970-01-01
    相关资源
    最近更新 更多