相关疑难解决方法(0)

为什么在宏中使用明显无意义的do-while和if-else语句?

在许多C/C++宏中,我看到宏的代码包含在看似无意义的do while循环中.这是一些例子.

#define FOO(X) do { f(X); g(X); } while (0)
#define FOO(X) if (1) { f(X); g(X); } else
Run Code Online (Sandbox Code Playgroud)

我看不出它do while在做什么.为什么不在没有它的情况下写这个?

#define FOO(X) f(X); g(X)
Run Code Online (Sandbox Code Playgroud)

c c++ c++-faq c-preprocessor

758
推荐指数
8
解决办法
9万
查看次数

C中的MIN和MAX

在C中的位置MINMAX定义,如果有的话?

实现这些的最佳方式是什么,尽可能通用和安全?(首选编译器扩展/内置主流编译器.)

c max min c-preprocessor

265
推荐指数
11
解决办法
67万
查看次数

为什么C宏不是类型安全的?

如果遇到了这种说法 时间并不能弄清楚什么是应该的意思.由于生成的代码是使用常规C编译器编译的,因此最终会像任何其他代码一样(或很少)检查类型.

那么为什么宏不安全呢?这似乎是他们应被视为邪恶的主要原因之一.

c c++ macros types

22
推荐指数
3
解决办法
6948
查看次数

在宏中使用({...})括号来吞下分号

通常,在宏中,您会看到人们使用a do { ... } while(0)来吞下分号.我刚刚遇到了一个他们使用的例子({ ... }),它似乎不仅吞下了分号,而且似乎也允许你返回一个值:

#define NEW_MACRO()  ({ int x = 1; int y = 2; x+y; })

 if(1) 
   val = NEW_MACRO(); 
 else 
   printf("this never prints");`
Run Code Online (Sandbox Code Playgroud)

val会出来3.我找不到任何关于它的文档,所以我对它有点警惕.这种方法有什么问题吗?

c macros

6
推荐指数
1
解决办法
2588
查看次数

标签 统计

c ×4

c++ ×2

c-preprocessor ×2

macros ×2

c++-faq ×1

max ×1

min ×1

types ×1