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

时间:2010-11-26 10:23:47

标签: c c-preprocessor stringification

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

2 个答案:

答案 0 :(得分:3)

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

我做了一些测试,并明确地使用换行符号似乎有效:

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

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

答案 1 :(得分:3)

  

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

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