所以我希望有一个文件可以有条件地包含为代码或字符串。 像这样:
#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。这可能是不可能的。 (尝试再次删除欺骗标记..如果你仍然认为它是一个欺骗,请发表评论)
答案 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() );
是否会打印代码并运行它。