Tag: c preprocessor

用宏包装函数(不重命名)C

我有兴趣在现有函数调用周围添加一些额外的逻辑,通过包装它们而不重命名它们。 (仅用于测试) 。 我发现的现有解决方案依赖于将函数包装在不同名称的宏中,这可能意味着更改了大量代码。 有什么建议? 注意,我知道LD_PRELOAD ,但我有兴趣使用宏来检查传递给函数的参数(例如使用_Generic )。

最有用的用户自制C-宏(在GCC中,也是C99)?

您认为哪种C宏最有用? 我找到了以下一个,我用它在C中进行矢量运算: #define v3_op_v3(x, op, y, z) {z[0]=x[0] op y[0]; \ z[1]=x[1] op y[1]; \ z[2]=x[2] op y[2];} 它的工作方式如下: v3_op_v3(vectorA, +, vectorB, vectorC); v3_op_v3(vectorE, *, vectorF, vectorJ); …

为什么在宏定义中使用do {} while(0)?

可能重复: 为什么在C / C ++宏中有时会出现无意义的do / while和if / else语句? 我遇到了如下代码: #define ev_io_init(ev,cb,fd,events) \ do { \ ev_init ((ev), (cb)); \ ev_io_set ((ev),(fd),(events)); \ } while (0) 我想知道为什么作者在这里使用do { } while (0) 。 这有什么不同吗? #define ev_io_init(ev,cb,fd,events) { \ ev_init ((ev), (cb)); \ ev_io_set ((ev),(fd),(events)); \ } BTW:代码来自libev,ev_local.h

如何将内存分配给c中的宏?

我想知道如何将内存分配给C中的#define变量。 #define VAR1 10 我有两个问题…… VAR1的类型是什么? 存储段VAR1存储在哪?

C编程:预处理器,包括宏的文件

如果我能找到一种方法来做类似的事情,我可以在我的应用程序中删除数百行代码,并大大提高可维护性。 有人有主意吗? #include int main( ) { #define include_all_files(root) \ #include #root “1.h” \ #include #root “2.h” \ #include #root “3.h” \ #include #root “4.h” include_all_files( first_library ) include_all_files( second_library ) include_all_files( third_library ) return 0; } 编辑 : 我很欣赏这些回复,我的例子似乎导致了误导,所以这就是我实际上要解决的问题: 我正在实现一个有限状态机。 通过命名约定,我已经让它变得像添加状态一样简单: STATE(initial_screen) #include “initial_screen.state” END_STATE STATE(login) #include “login.state” END_STATE 但是,如果我能回答原来的问题,我可以将其重构为简单的事情: ADD_STATE(initial_screen) ADD_STATE(login) 这是因为文件名和状态名称以及所有底层连接和其他所有内容都遵循类似的约定。 但是,我无法弄清楚如何根据宏中收到的令牌实现包含文件。

cpp预处理器输出无法理解?

对不起,如果我的问题非常基本。 我想了解预处理器cpp产生的输出。 假设我有一个非常基本的跟随程序。 #include #include int x=100; int main () { printf (“\n Welcome..\n”); } 我执行以下命令。 cpp main.c main.i 在main.i # 1 “/usr/include/stdio.h” 1 3 4 上面这行是什么意思?

有没有办法控制宏扩展顺序

我希望有人可能知道如何控制/指定宏扩展的顺序。 以下是上下文: // 32 bit increments, processor has registers for set, clear and invert #define CLR_OFF 1 #define SET_OFF 2 #define INV_OFF 3 #define SET(reg,bits) *((volatile unsigned long*)(& reg+SET_OFF)) = bits //Now if I use this I can do it quite nicely with #define STATUS_LED 0x0040; SET(LATB, STATUS_LED); // LATB is port of the LED. […]

将循环放在C宏中

我正在寻找一种方法将以下函数结构转换为宏。 我知道,这是一个愚蠢而毫无意义的例子,但它说明了这一点,因为我无法透露我的实际源代码。 int foo(int x, int y) { do { –x; ++y; }while(x > y); return x * y; //note that x and y have changed values here. } 这样我就可以在main或其他函数中调用函数,如下所示: int next_x = foo(x,y); 我似乎无法在这里获得100%正确的语法。 这是我的不良尝试: #define FOO(x,y) \ ( \ do \ { \ –x; \ ++y; \ }while(x < y), \ x \ […]

这里代码中的#define指令中的##是什么意思

请解释一下答案: #define f(g,h) g##h main(){ printf(“%d”,f(100,10)); }

在#define子句中,如何使预处理器替换变量名中的参数?

我有以下代码: #define MY_MACRO(PARAM) int PARAM_int; double PARAM_double; [subsequent instructions] 不幸的是,它不起作用,这意味着PARAM不会在变量名称中被替换。 这可以解决吗?