Tag: 字符串化

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

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

这个C代码如何工作?

什么是a##b & #a ? #define f(a,b) a##b #define g(a) #a #define h(a) g(a) main() { printf(“%s\n”,h(f(1,2))); //how should I interpret this?? [line 1] printf(“%s\n”,g(f(1,2))); //and this? [line 2] } 这个程序如何运作? 输出是 12 f(1, 2) 现在我明白a##b & #a如何工作的。 但为什么两种情况(第1行和第2行)的结果不同?

Stringify C预处理

这是我的第一篇文章,所以如果我太模糊或提供每个人都会直观地假设的信息,请告诉我。 我很想用C语言写作,我只是想更好地理解预处理。 我正在编写一个简单的程序,可以直接从控制台使用gcc -Wall -std=c99 -DSEED=argument ,其中我的参数应该是一个整数,或者如果未定义-D则用户将输入它。 SEED值仅用于srand() 。 我很困惑,为什么我的代码不能编译,如果我输入-DSEED=a作为我的参数,而如果我把-DSEED=1它将编译。 我得到了一个“未声明的(在这个函数中首次使用)”错误,并且真的不明白两者之间的区别。 我认为#define将变量类型与输入匹配,所以如果我输入“a”#SEED将是一个char,如果我输入“1”#SEED将是一个int。 如果未定义SEED,我正在使用#ifndef SEED命令,这很有效。 我想我应该“输入”输入SEED ,然后检查它是否是整数。 在线阅读一些文章之后我正在尝试使用: #ifndef SEED //code #else #define TO_STRING( input ) #input char c; c = TO_STRING( SEED ) //Then I was going to use c to figure out if it was an int. #endif 这是行不通的,任何能够指出你认为我可能有的任何误解的人都会非常感激。 编辑 – 所以我确实弄清楚为什么我在尝试-DSEED=a时收到错误消息,因为它正在将其作为变量读取。

宏中的#和##

#include #define f(a,b) a##b #define g(a) #a #define h(a) g(a) int main() { printf(“%s\n”,h(f(1,2))); printf(“%s\n”,g(f(1,2))); return 0; } 只需通过查看程序,“可能”期望输出,对于两个printf语句都是相同的。 但是在运行程序时,你会得到它: bash$ ./a.out 12 f(1,2) bash$ 为什么会这样?