Tag:

宏观扩张的确切步骤是什么?

这不能按预期工作: #define stringify(x) #x printf(“Error at line ” stringify(__LINE__)); 这有效: #define stringify1(x) #x #define stringify(x) stringify1(x) printf(“Error at line ” stringify(__LINE__)); 预处理用于扩展此类宏的优先级是什么?

C宏 – 动态#include

我试图弄清楚如何使用GCC为#include语句构建变量字符串。 我的想法是,对于我编写的每个源模块,我希望包含一个动态生成的C源头,它是在构建过程的早期创建的。 生成此文件不是问题。 不幸的是,包括它在内。 到目前为止我所拥有的是(identities.h): // identities.h # define PASTER2(str) #str # define PASTER(str) PASTER2(str ## .iden) # define EVALUATOR(x) PASTER(x) # define IDENTITIES_FILE EVALUATOR(__FILE__) # include IDENTITIES_FILE 理想情况下,这将使用(main.c): //main.c # include “identities.h” int main() {return 0;} 在编译之前,预处理器将在一次传递中扩展为: //main.c (preprocessed) # include “main.c.iden” int main() {return 0;} 我正在使用的两个间接级别(PASTER和EVALUATOR)是这篇文章的结果。 不幸的是,这不起作用,我留下了错误: obj/win32/dbg/main.o In file included from main.c:1:0: […]

C预处理器定义生成的函数名称

我有一种情况,我有很多生成的函数,并希望将它们指向我创建的一些通用函数(允许我在生成的函数名称更改时重用基本代码)。 基本上,我有一个函数名列表如下: void Callback_SignalName1(void); void Callback_SignalName2(void); …etc 一旦生成了这些,我想定义一个宏来允许它们被一般地调用。 我的想法是这样,但我没有任何运气实现它…因为C预处理器采用宏的名称而不是宏定义为: #define SIGNAL1 SignalName1 #define SIGNAL2 SignalName2 #define FUNCTION_NAME(signal) (void Callback_ ## signal ## (void)) … … FUNCTION_NAME(SIGNAL1) { .. return; } 问题是我收到了 void Callback_SIGNAL1(void) 代替 void Callback_SignalName1(void) 这有什么好方法吗?

C / C ++中的自展开宏循环

我目前正在开展一个项目,每个周期都很重要。 在分析我的应用程序时,我发现一些内部循环的开销非常高,因为它们只包含一些机器指令。 此外,这些循环中的迭代次数在编译时是已知的。 所以我认为不是手动展开带有复制和粘贴的循环,而是可以使用宏在编译时展开循环,以便以后可以轻松修改它。 我的形象是这样的: #define LOOP_N_TIMES(N, CODE) 这样我就可以替换for (int i = 0; i < N, ++i) { do_stuff(); } 用: #define INNER_LOOP_COUNT 4 LOOP_N_TIMES(INNER_LOOP_COUNT, do_stuff();) 它将自己展开: do_stuff(); do_stuff(); do_stuff(); do_stuff(); 由于C预处理器在大多数时间对我来说仍然是一个谜,我不知道如何实现这一点,但我知道它必须是可能的,因为Boost似乎有一个BOOST_PP_REPEAT宏。 不幸的是我不能在这个项目中使用Boost。

C预处理器宏用于返回重复一定次数的字符串

有人知道任何C99预处理器魔法允许创建一个由另一个重复N次的字符串组成的字符串吗? 例如 STRREP( “%s “, 3 ) 变 “%s %s %s ” 经过预处理。 我能想到的唯一一件事就是这样 #define STRREP( str, N ) STRREP_##N( str ) #define STRREP_0(str) “” #define STRREP_1(str) str #define STRREP_2(str) str str #define STRREP_3(str) str str str … 哪个效果很好,但是很难看,因为我必须手动为每个重复长度定义一个宏。 我想与variadic宏和宏一起使用它返回此处显示的宏参数的数量。

通用编译器独立的方式在C / C ++中实现UNUSED宏

在实现存根等时,您希望避免使用“未使用的变量”警告。 多年来,我遇到过UNUSED()宏的一些替代方案,但从来没有一个被certificate适用于“所有”编译器,或者标准是气密的。 或者我们是否坚持使用每个构建平台的#ifdef块? 编辑:由于非c兼容替代品的答案很多,我想澄清我正在寻找一个对C和C ++,所有口味等都有效的定义。

#if定义的MACRO是否相当于#ifdef MACRO?

我有代码,我想有两种模式, debug和verbose 。 我在我的头文件中定义它们, #define verbose TRUE #define debug TRUE 到目前为止,在我的代码中,我刚刚使用过 #if(debug) //code #endif 但使用起来更合适 #ifdef debug // code #endif 我读了一些关于预处理器宏的内容,但当时没有意义。 所以,我有疑问, #if defined MACRO相当于#ifdef MACRO ? 哪个更好地启用/禁用特定代码段?

为什么“i”变量在我的程序中增加两倍?

我的一位朋友向我展示了这个程序并问我为什么变量增加两倍。 根据我的理解MAX(i++, ++j); 在这一行中, i首先作为参数发送然后递增,所以如果i的初始值是10则递增的值应该是11 ,但是它将i的递增值显示为12 。 计划: #include #define MAX(x,y) (x)>(y)?(x):(y) void main(void) { int i = 10; int j = 5; int k = 0; k = MAX(i++, ++j); printf(“%d %d %d”,i,j,k); } 输出: 12 6 11 有人可以解释一下我的价值是如何增加到12的? 谢谢。

C预处理器宏是否可以包含预处理程序指令?

我想做相同的以下内容: #define print_max(TYPE) \ # ifdef TYPE##_MAX \ printf(“%lld\n”, TYPE##_MAX); \ # endif print_max(INT); 现在,只要我在函数宏中看到,就不允许使用#ifdef或任何嵌套的预处理器指令。 有任何想法吗? 更新:所以看起来这是不可能的。 即使是在运行时检查的黑客也无法实现。 所以我想我会选择以下内容: #ifndef BLAH_MAX # define BLAH_MAX 0 #endif # etc… for each type I’m interested in #define print_max(TYPE) \ if (TYPE##_MAX) \ printf(“%lld\n”, TYPE##_MAX); print_max(INT); print_max(BLAH);

什么是副作用的表达式,为什么不将它们传递给宏?

我在文本C如何编程中遇到了一个声明: “不应将具有副作用的表达式(即,修改变量值)传递给宏,因为宏参数可能会被多次评估。” 我的问题是什么是副作用的表达式,为什么不将它们传递给宏?