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

标签 c c-preprocessor stringification

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

最近看到一个 friend 的项目。由于我不明白的原因,他在运行时编译的字符串中编写代码。这导致类似的结果:

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[] y = STRINGIFY(
                int x = 5;\n
                printf("%i", x);\n
        );

虽然我只在 Linux 上测试过这个,但没有在语法感知的 IDE 中测试过。那些“看起来很简单”的换行符可能会被聪明的语法高亮标记为语法错误。

关于c - 使用预处理器将代码转换为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4284403/

相关文章:

c++ - "#define TYPE(x) typename decltype(x)"是个坏主意吗?

python - 将头文件 #ifndef 添加到当前目录下的 C 头文件中

c - 如何使命令行中的 -D 值成为字符串?

php - 网页不保留换行符

c++ - 未指定字符串化运算符的评估顺序

c - sleep 功能会在收到信号时中止吗?

c - 关于逻辑运算符的基本编程练习

c - inline和#define在实践中有什么区别?

c - C中指向结构和数组的指针

c - 使用进程、fork 命令