2010-11-26 88 views
1

声明:我不是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。

+0

不工作? char x [] =“int x = 5; \ n printf(\”%i \“,x)”; – fazo 2010-11-26 10:25:55

+0

我想要做的事情的目标是将VS欺骗成语法突出显示,“intellisensing”等编写在字符串中的代码。 – 2010-11-26 11:08:57

回答

3

我第一次建议,只是逃避换行应该就够了。有时间来验证(并看到问题所有者的评论),我意识到这并没有削减它。

我做了一些测试,并在新行符号明确地把似乎工作:

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

我只测试了在Linux上虽然不是在语法感知的IDE。这些“裸露的”换行符可能会被巧妙的语法高亮显示标记为语法错误。

3

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

是什么让你说这个?看看CUDA SDK示例,您可以将CUDA代码放入.cu文件,然后使用nvcc进行编译。你可以有语法高亮显示,intellisense和所有Visual Studio的优点!请参阅CUDA编程指南和this post以获取更多信息