如何在cpp中包含文件作为字符串和代码?

时间:2015-01-23 04:24:21

标签: c++ c++11 macros glsl

所以我希望有一个文件可以有条件地包含为代码或字符串。 像这样:

#define something
#include "myfile.inc" 

#undef something
const char myfileasastring = 
#include "myfile.inc" 

myfile.inc就是这样的简单代码:

something // anything extra here is fine as long as it goes away in the code include case
int myfunc() { return 23; } 

这可能吗?我尝试了#define R(“mystring并用它启动myfile,但这似乎不起作用。

我的具体用例是一个GLSL着色器,当在GL下运行时我需要作为字符串传递给GL驱动程序,但是当在软件模拟中运行时我想将其编译为CPP代码。

我希望两种情况都有相同的文件。我知道项目/ make / build级别的许多变通方法,即使只是剪切和粘贴也不是很糟糕,但是有一个可移植的编译器级别的方法可以做到这一点。

未检测到欺骗。我知道如何将xor包含在另一个中,但不能同时包含在同一个文件中。我也知道如何使用外部工具来做,我真的只是想知道是否只是简单的便携式c ++ 11。这可能是不可能的。 (尝试再次删除欺骗标记..如果你仍然认为它是一个欺骗,请发表评论)

3 个答案:

答案 0 :(得分:1)

创建一个名为include.cpp的文件,其中包含以下内容:

int f()
{
  return 42;
}

然后,main.cpp(灵感来自https://stackoverflow.com/a/25021520/4323):

#include <iostream>
#include "include.cpp"

int main()
{
  const char* const str =
    R"(include(include.cpp))"
  ;
  std::cout << str << '\n';
  return f();
}

include()语法是什么?这是m4!所以你这样编译:

m4 main.cpp | g++ -x c++ -std=c++11 -

或者,如果您无法在编译命令中使用管道:

g++ -x c++ -std=c++11 <(m4 main.cpp)

如果您使用第二个选项,则需要-I规则来告诉编译器#include "include.cpp"的位置,因为源文件&#34;存在&#34;在/dev中(它是一个Bash-ism)。你可以改为说include(include.cpp),而不是在顶部使用#include,无论哪种方式都有效。

程序打印来自include.cpp的代码,然后调用其中的函数。

我为使用m4道歉,但它可以在很多系统上使用(你可以为其他系统编写自己的简单实现)。

答案 1 :(得分:1)

我参与了一个我们做过类似事情的项目。我们编写了一个脚本来将代码编译为C ++,然后将我们的主要目标(我们的应用程序)与结果相关联。然后,我们还将代码作为资源包含在我们正在构建的应用程序或库中,并在我们想要将其作为glsl传递给OpenGL时从磁盘读取它。我们在Xcode中通过首先将代码编译为C ++的目标编译到共享库中,以及我们的应用程序的第二个目标链接到生成的共享库,并将代码作为文本文件复制到我们的应用程序包中。您可以使用make文件或Visual Studio或您正在使用的任何工具执行相同的操作。

答案 2 :(得分:1)

抱歉浪费每个人的时间啊。我想通了,这很简单:

test.inc:

#ifdef ASSTRING
R"foo(
#else
int do () { return 23; }
// )foo";
#endif

的main.cpp

#define ASSTRING
const char s[] =
#include "test.inc";

#undef ASSTRING
#include "test.inc"

printf ( "hello\n%s\n%i\n", s+6, me() );

是否会打印代码并运行它。