Tag: c preprocessor

#define C中的元组

我希望能够定义一个表示其他宏所需参数的元组。 我认为展示我想要的最好方法是展示一个例子: #include #define LED_PORT PORTB #define LED_DDR DDRB #define LED_PIN PB7 #define LED LED_PORT, LED_DDR, LED_PIN #define OUTPUT(port, ddr, pin) ddr |= 1 << pin void main(void) { OUTPUT(LED); } 我想将OUTPUT(LED)扩展为: LED_DDR |= 1 << LED_PIN 我得到的问题是扩展的顺序,并导致以下错误: 宏“OUTPUT”需要3个参数,但只有1个参数 这适用于具有定制硬件的AVR项目,其中我已经定义了LED和其他具有相应LED_PORT LED_DDR和LED_PIN 。 然后我想要定义更多的宏,这些宏可以使用这个LED并使用适当的参数来映射到最简洁的方式。 这是否可以使用标准的C预处理器?

C预处理器和操作顺序

我正在学习C,但我不明白这一点: #define square(x) x*x a = square(2+3) //a = 11 当这个运行时,为什么最终会成为11 ?

Qt Creator上的预处理器输出

我在Qt Creator中编译C代码,我需要查看预处理器输出。 我在make中添加了-E标志,但是我没有看到* .i文件: mingw32-make.exe -e -w in \qt\qt-build-desktop 请帮忙。

如何使用CPP预处理器编写递归for循环“重复”宏来生成C代码?

我想强制预处理器为我做一些自动代码生成。 我不需要太多:只是一个包含另一个for循环的简单for循环。[1] 我已经阅读了所有关于宏观扩展的内容,并且在蓝色涂料出现时不再傻笑。 在美好的一天,我甚至可以解释为什么需要多层宏来生成带有标记粘贴的函数名称。 我实际上已经让for-loop工作了。 但是当把循环放在一个循环中时,我会减少随机地使用DEFER,EVAL和OBSTRUCT并且希望最好。 我不会被理智的召唤吓倒。 我确实想用标准的C预处理器来做这件事。 我保证无论结果如何,我,我的雇主和我的inheritance人都不会因技术弊端而起诉你。 我保证如果没有适当的安全眼镜,我不会允许任何人维护代码,甚至不能查看代码。 如果你愿意,假装我只是在考虑理论上的兴趣。 或者我唯一的另一种选择是使用M4:因为如果CPP中的递归宏是变态的,那么M4肯定是整只鸡。 我发现的最好的参考资料是一个有9年历史的Usenet线程: http : //comp.std.c.narkive.com/5WbJfCof/double-cpp-expansion 它开始偏离主题,在语气方面有些小而且好斗,而且是我的头脑。 但我认为我寻求的答案就在那里。 接下来最好的是一个名为Cloak的CPP滥用标题的文档: https : //github.com/pfultz2/Cloak/wiki/C-Preprocessor-tricks,-tips,-and-idioms 它需要一种不同的迭代方法,或许可以满足我的需求。 但它也是一个很好的概述。 这里有一些简短的代码,以显示我被卡住的地方。 repeat.h: #define REPEAT(macro, times, start_n, next_func, next_arg, macro_args…) \ _REPEAT_ ## times(macro, start_n, next_func, next_arg, ## macro_args) #define REPEAT_ADD_ONE(macro, times, start_n, macro_args… ) \ REPEAT(macro, times, start_n, _REPEAT_ADD_ONE, 0, ## […]

C预处理器:如何创建字符文字?

出于好奇,我想知道是否可以定义一个可以将其参数转换为字符文字的宏: switch(getchar()) { case MYMACRO(A): printf(“Received A\n”); break; case MYMACRO(a): printf(“Received a\n”); break; case MYMACRO(!): printf(“Received an exclamation mark\n”); break; default: printf(“Neither a nor A nor !\n”); break; } 我头脑中有两种可能的解决方案: 枚举所有字符 #define LITERAL_a ‘a’ #define LITERAL_b ‘b’ … #define MYMACRO(x) LITERAL_ ## x 它不适用于MYMACRO(!)因为! 不是C标识符的有效组件。 将参数转换为字符串文字 #define MYMACRO(x) #x [0] 它涉及指针取消引用,并且在诸如案例标签的地方无效。 我不是要求一种方法来“改进”上面的switch语句本身。 这只是一个玩具的例子。 重复。 这只是一个玩具的例子。

在编译时将文件读入字符串

我想在文件中写一些东西(我们称之为foo.cpp )并在编译时将它作为字符串包含在我的程序中 ,类似于#include的方式。 现在我正在使用这个C预处理器#define : #define toString(src) #src 将一堆代码转换为字符串,如下例所示: const char* str = toString( int x; void main(){} ); 如果需要,您可以在那里阅读宏字符串化。 我想将该代码移动到外部文件,该文件将在编译时“链接”。 我不希望文件必须与程序一起分发,如果我在运行时读取它就是这种情况。 我尝试使用#include指令,如下所示,但编译器拒绝了它: const char* str = toString( #include “foo.cpp” ); g++似乎完全混淆了,但是clang++给了我这个错误: error: embedding a #include directive within macro arguments is not supported 有谁知道是否/如何做到这一点? 注意:我正在使用它来编写我的GLSL着色器,尽管我怀疑这些信息是否有用。 PS:在你告诉我这是一个重复的问题之前 ,把我的代码放在一个巨大的字符串中,或​​者使用外部工具(例如xxd )来转储它的hex表示对我来说不是“解决方案”,因为它们并不比我现在的方法更好(即更容易/更清洁)。 几年后更新: 我刚刚意识到我从来没有回答这个问题,因为它被重复关闭了。 当我看到这个提交时 ,我找到了我正在寻找的答案,它本身基于对本文的评论 ,并且从那时起一直在使用它。 简而言之,一个小的汇编文件包含您想要的文件并在给定的NAME下公开它们,使用三个变量NAME_begin , […]

C,Objective-C预处理器输出

有没有办法获得预处理的C / Objective-C代码? 我有一些我获得的文件,并希望看到一些#defines生成的代码。

Variadic宏和尾随逗号

我试图在C中进行面向对象,并希望为符号设置一个语法糖宏 object->vtable->method(object, arg1, arg2) 成 send(object, method, arg1, arg2) 不幸的是,当一个方法不参数时,就会出现尾随的逗号问题 send(object, method) 给 object->vtable->method(object, ) 是否有任何便携式 (没有##__VA_ARGS__或Visual Studio)这样做? 我想出了一个,但我需要交换对象和方法 #define FIRST_ARG_(N, …) N #define FIRST_ARG(args) FIRST_ARG_(args) #define send(msg, …) \ FIRST_ARG(__VA_ARGS__)->vtable->msg(__VA_ARGS__) 许可证 send(method, object) send(method, object, arg1, arg2) 编辑 在下面两个很好的答案的帮助下,我将使用这些宏来完成。 它最多可以处理16个参数,但可以轻松扩展 #define SEND_NO_ARG(obj, msg) obj->vtable->msg(obj) #define SEND_ARG(obj, msg, …) obj->vtable->msg(obj, __VA_ARGS__) #define GET_18TH_ARG(arg1, arg2, arg3, […]

使用#include加载OpenCL代码

我很久以前就用hlsl / glsl着色器代码看到了这一点 – 在源代码文件上使用#include将代码粘贴到char*这样在运行时就不会发生文件IO。 如果我将它表示为伪代码,它看起来有点像这样: #define CLSourceToString(filename) ” #include “filename” ” const char* kernel = CLSourceToString(“kernel.cl”); 现在当然#define不会起作用,因为它只会尝试使用这些引号来启动字符串。

什么是C中的“私人标题”?

我最近一直在学习C ,在我的一本教科书中,我找到了一个带有“.r”扩展名的文件的引用。 现在,你可以想象,谷歌搜索“r”或“文件扩展名r”没有效率,所以我想知道你是否可以帮助我。 它出现在以下代码块中 #include “new.r” static const struct Class _String = { sizeof(struct String), String_ctor, String_dtor, String_clone, String_differ }; const void * String = & _String; 作者提到它是一个“私人标题”,但我希望他能更明确地知道究竟是什么。