【问题标题】:Use the preprocessor to convert code into a string使用预处理器将代码转换为字符串
【发布时间】:2010-11-26 10:23:47
【问题描述】:

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

【问题讨论】:

  • 这不起作用吗? char x[] = "int x = 5;\n printf(\"%i\", x)";
  • 我想要做的目标是欺骗VS进入语法高亮,“智能感知”等写入字符串的代码。
  • 你想做什么?如果您尝试从 GPU 将内容打印到标准输出,我认为您没有走在正确的轨道上......

标签: c c-preprocessor stringification


【解决方案1】:

我首先建议只转义换行符就足够了。有时间验证(并看到问题所有者的评论)后,我意识到这并没有解决问题。

我做了一些测试,明确输入换行符似乎有效:

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

我只在 Linux 上测试过这个,而不是在语法感知的 IDE 中。那些“看起来很简单”的换行符可能会被一个聪明的语法突出显示标记为语法错误。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 感谢您提供有关使用 CUDA 的提示。但是,这个问题不是关于 CUDA,而是关于滥用预处理器。
    猜你喜欢
    • 2010-09-19
    • 2013-03-17
    • 1970-01-01
    • 2011-01-12
    • 1970-01-01
    • 2018-11-13
    相关资源
    最近更新 更多