相关疑难解决方法(0)

C/C++,您可以将文件#include到字符串文字中吗?

我有一个C++源文件和一个Python源文件.我希望C++源文件能够将Python源文件的内容用作大字符串文字.我可以这样做:

char* python_code = "
#include "script.py"
"
Run Code Online (Sandbox Code Playgroud)

但这不起作用,因为每条线的末尾都需要.我可以手动复制并粘贴Python代码的内容,并用引号和终止\n包围每一行,但这很难看.即使python源有效地编译到我的C++应用程序中,我也希望将它保存在一个单独的文件中,因为它更有条理,并且对编辑器更有效(emacs不够聪明,无法识别C字符串文字是python代码,当你在里面时切换到python模式).

请不要建议我使用PyRun_File,这是我首先要避免的;)

c c++ include string-literals c-preprocessor

41
推荐指数
2
解决办法
2万
查看次数

预处理器tomfoolery(字符串化#include)

注意:这个问题与OpenCL本身无关......请查看最后一段,以获得我的问题的简洁陈述.但要提供一些背景知识:

我正在编写一些使用OpenCL的C++代码.我喜欢将OpenCL内核的源代码保存在自己的文件中,以保持编码和维护的简单性(而不是将源代码直接嵌入到相关C++代码中的字符串常量中).这一问题不可避免地导致了一旦分配二进制文件时如何将它们加载到OpenCL运行时的问题 - 理想情况下,OpenCL源包含在二进制文件中,因此二进制文件不需要在特定的位置在一些目录结构中,知道OpenCL源代码的位置.

我想将OpenCL文件作为字符串常量包含在某处,最好不使用额外的构建步骤或外部工具(对于交叉编译器/跨平台易用性...即,不xxd等等).我以为我偶然发现了一个基于这个帖子中第二个答案的技术,就像这样:

#define STRINGIFY(src) #src

inline const char* Kernels() {
  static const char* kernels = STRINGIFY(
    #include "kernels/util.cl"
    #include "kernels/basic.cl"
  );
  return kernels;
}
Run Code Online (Sandbox Code Playgroud)

请注意,STRINGIFY如果可能的话,我宁愿不在我的OpenCL代码中嵌入宏(如上面引用的SO问题中所做的那样).现在,这在Clang/LLVM编译器上运行得非常好,但是GCC死了一个可怕的死亡("未终止的参数列表调用宏STRINGIFY"和与.cl文件的内容相关的各种语法"错误"出现).所以,很明显这个确切的技术在编译器中是不可用的(没有尝试过MSVC,但我也希望它能在那里工作)...我怎么能最低限度地按摩它以便它可以在编译器中工作?

总之,我想要一种符合标准的技术,将文件内容作为C/C++字符串常量包含在内,而无需调用外部工具或使用无关代码污染文件.想法?

编辑:正如Potatoswatter指出的那样,上面的行为是未定义的,所以一个真正的交叉编译器预处理器技术不涉及触摸要被字符串化的文件可能是不可能的(第一个找出令人发指的人)黑客工具,的工作对大多数/所有的编译器得到的答案要点).对于好奇的,最后我做什么在第二个响应建议在这里 ......也就是说,我添加了STRINGIFY直接宏OpenCL的文件,我包括:

somefile.cl:

STRINGIFY(
  ... // Lots of OpenCL code
)
Run Code Online (Sandbox Code Playgroud)

somefile.cpp:

#define STRINGIFY(src) #src

inline const char* Kernels() {
  static const char* kernels =
    #include "somefile.cl"
    ;
  return kernels;
}
Run Code Online (Sandbox Code Playgroud)

这在我尝试过的编译器中起作用(Clang和GCC也是如此,因为它在宏内部没有预处理器指令),并且至少在我的上下文中并没有太大的负担(即,它没有' t干扰语法高亮/编辑OpenCL文件).像这样的预处理器方法的一个特点是,由于相邻的字符串被连接起来,你可以写

inline const …
Run Code Online (Sandbox Code Playgroud)

c++ include opencl stringification c-preprocessor

17
推荐指数
1
解决办法
6162
查看次数

将OpenCL代码嵌入到可执行文件中

这是使用#include加载OpenCL代码的后续操作

我注意到当你使用grrussel描述的方法(并在Bullet Physics中使用)时,创建的字符串会删除所有换行符(注释似乎也被剥离了,但我并不太担心).现在大多数情况下,如果包含的opencl代码中没有任何预处理器定义,那么这很好,但如果有代码将无法使用OpenCL编译器进行编译.

有没有得到的方式#include来保持换行符在那里,或者有没有更好的方法,以嵌入的OpenCL代码到我的可执行文件(不是复制字符串转换成CPP文件,并把报价周围的一切其他)?

我在Visual Studio 2010中对此进行了测试,我不确定其他编译器是否表现出相同的行为.我更喜欢一种不需要任何外部工具并且可以与各种编译器/平台配合使用的方法.

其他答案的复制代码:

在C++/C源代码中

#define MSTRINGIFY(A) #A
char* stringifiedSourceCL = 
#include "VectorAddKernels.cl"
Run Code Online (Sandbox Code Playgroud)

在OpenCL源代码中

MSTRINGIFY(
   __kernel void VectorAdd(__global float8* c)
   {
    // snipped out OpenCL code...
    return;
   }
);
Run Code Online (Sandbox Code Playgroud)

c++ visual-studio-2010 opencl

5
推荐指数
1
解决办法
1644
查看次数