Tag: c 预处理器

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

免责声明:我不是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宏至少有两个数字

我想用#define创建一个简单的宏来返回两个较小的数字。 我怎么能在C中这样做? 提出一些想法,看看你是否可以使它更加模糊。

抑制C宏变量替换

我有这段代码(实际上是垃圾收集的Forth系统的解释器的一部分): #define PRIMITIVE(name) \ do \ { \ VocabEntry* entry = (VocabEntry*)gc_alloc(sizeof(VocabEntry)); \ entry->code = name; \ entry->name = cstr_to_pstr(#name); \ entry->prev = latest_vocab_entry; \ latest_vocab_entry = entry; \ } \ while (false) PRIMITIVE(dup); PRIMITIVE(drop); PRIMITIVE(swap); // and a lot more 但是有一个问题:在线 entry->name = cstr_to_pstr(#name); name字段替换dup , drop , swap和其余部分。 我希望字段名称不被替换。 那么,有没有办法解决这个问题,除了简单地重命名宏参数? 作为答案,请解释一般是否有一种方法来抑制宏体中宏参数名称的替换。 不要回答“只是这样做”(请)。

这个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时收到错误消息,因为它正在将其作为变量读取。

在c预处理器语句中添加零

在查看一些c头文件(特别是stdarg.h )时,我注意到一条非常特殊的线: #if !defined(__STRICT_ANSI__) || __STDC_VERSION__ + 0 >= 199900L 奇怪的部分是+ 0 。 零是附加的身份; 这是写noop的各种数学之一。 在上面的预处理器语句中添加零的目的是什么? 我知道那里有各种奇怪的预处理器魔法 ,但这看起来很荒谬。

宏中的#和##

#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$ 为什么会这样?