使用预处理器将代码转换为字符串

免责声明:我不是C程序员。

我最近见过一个朋友的项目。 由于我不理解的原因,他将代码写入在运行时编译的字符串中。 这导致类似于:

char x[] = "int y = 5; printf(\"%i\", y)"; run_this_code(x); 

使用起来很糟糕,因为Visual Studio不介入并进行语法高亮等。

使用一些预处理程序滥用,可以让Visual Studio认为您正在编写实际代码,然后让预处理器在编译器获取源代码之前将其转换为字符串。 这有效:

 #define STRINGIFY(x) #x int main(void){ char[] y = STRINGIFY( int x = 5; printf("%i", x); ); printf("%s", y); } 

这个问题是打印出来:

 int x = 5; printf("%i\n", x); 

问题是运行时编译器在第1行上说错误。有没有办法让它包含换行符?

更新这不是我的问题。 这是别人的代码,我只是对使用预处理器让他的生活更轻松的想法感兴趣。 我不知道为什么他这样做。

更新删除了所有提及的CUDA,因为这个问题是关于预处理器,而不是CUDA。

我首先建议只是逃避换行就足够了。 有时间validation(并看到问题所有者的评论),我意识到这不会削减它。

我做了一些测试,并明确地添加换行符号似乎工作:

 char[] y = STRINGIFY( int x = 5;\n printf("%i", x);\n ); 

我只在Linux上测试了这个,而不是在语法感知的IDE中。 通过巧妙的语法高亮显示,这些“裸露的”新行可能会被标记为语法错误。

在CUDA中编码时,您必须将所有代码以字符串forms发送到图形卡以进行编译。

是什么让你这么说? 看一下CUDA SDK示例,您可以将CUDA代码放入.cu文件中,然后使用nvcc编译。 您可以拥有语法高亮,智能感知和所有Visual Studio的优点! 有关更多信息,请参阅CUDA编程指南和本文