Tag:

c定义多行宏?

#define DEBUG_BREAK(a)\ if ((a)) \ {\ __asm int 3;\ } 我已经定义了一个宏,并尝试使用它 #include “test_define.h” int main() { DEBUG_BREAK(1 == 1); return 0; } 但是这个样本不会编译。 编译器会抱怨括号没有关闭。 如果我在源文件的末尾添加另一个} ,它会编译。 这个宏有什么问题?

Variadic UNUSEDfunction/宏

抑制C编译器有关未使用变量的警告的一种众所周知的可移植方法是(参见C代码中未使用的参数警告 ): #define UNUSED(x) (void)(x) 我正在寻找一种方法来概括它以获取多个输入(不同类型): void foo(int a, long b, void* c){ /* Want this: */ ALL_UNUSED(a, b, c); /* instead of: */ UNUSED(a); UNUSED(b); UNUSED(c); } 似乎可以做到这一点的一种方法是使用可变参数函数 static inline void ALL_UNUSED(int dummy, …) {} 但是,我怀疑这种解决方案在专家眼中是令人反感的。 是否有符合标准且可移植(即不使用__attribute__((unused)) )方式来制作可变参数UNUSED()函数/宏? 非常感谢! 编辑 在C99或C预处理器的上下文中似乎没有一种干净的方式来执行我的要求。 这就是人生。 在下面的回答中,@ Dabo展示了一种非常有趣的方式来做我要求使用的一系列宏。 这是整洁和翔实的(至少对我而言),所以我接受了这个答案。 也就是说,我不会将它部署在一个大型项目中,因为它的篇幅足以超过它带来的好处(在我看来)。 但人们会在这里得出不同的结论。 如下所述,使用空可变参数函数的方法也不完美。 虽然它是一个非常优雅的单行,但它会引发关于单元化变量的警告(如果它们是)。 此外,你必须相信你的编译器完全优化它,我原则上反对,但我尝试过的所有编译器实际上都是这样做的。 一个相关的情况是在早期高级接口设计阶段之后存根function。 然后你未使用的变量都将是函数参数并按定义初始化,以下方法可以正常工作 static inline […]

宏中的意外结果

我有一个简单的程序来计算立方体的体积。 它运行良好,但我得到的结果是错误的。 它的出现是“Y是392”。 任何人都可以帮助我理解为什么它是392? 我刚刚开始使用C,所以我不了解所有的代码。 我意识到这个宏写的很糟糕,我只是想在重写它之前理解它的行为。 #define CUBE(x) (x*x*x) void main(void); void main(void){ int x, y; x = 5; y = CUBE(++x); printf(“Y is %d \n”, y); }

用宏包装函数(不重命名)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); …

宏内的变量参数

我有两个函数foo1(a,b)&foo2(a,b,c)和一个宏 #define add(a,b) foo(a,b) 我需要重新定义宏来完成, 1.如果使用2个参数调用add(),则调用foo1 如果使用3个参数调用add(),则调用foo2 我是选项VA_ARGS的新手。 我怎样才能做到这一点

内联函数与宏函数

可能重复: 内联函数与预处理器宏 我想知道内联函数和宏函数之间的区别。 1)内联函数是否与宏函数相同? 2)我知道两者都没有被调用,但它们在编译阶段被代码替换。 不是? 3)如果有差异,你能指定吗?

如何将内存分配给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) 这是因为文件名和状态名称以及所有底层连接和其他所有内容都遵循类似的约定。 但是,我无法弄清楚如何根据宏中收到的令牌实现包含文件。

以下宏可能给应用程序带来哪些问题?

以下宏可以带来问题吗? #define sq(x) x*x 如果是,那么如何以及为什么?请帮助。