相关疑难解决方法(0)

以下代码如何工作?

    #define TYPE_CHECK(T, S)                                     \
    while (false) {                                              \
      *(static_cast<T* volatile*>(0)) = static_cast<S*>(0);      \
    }
Run Code Online (Sandbox Code Playgroud)

我正在阅读谷歌v8的代码,发现上面的宏进行类型检查.

但是,我不明白为什么会这样.虽然(假)永远不会被执行,对吧?有人可以解释这些线吗?谢谢

c++ templates v8

24
推荐指数
2
解决办法
561
查看次数

在C中用宏创建假函数可以多少钱?

人们总是说宏是不安全的,而且它们不是(直接)对其参数进行类型检查,等等.更糟糕的是:当发生错误时,编译器会给出内在和难以理解的诊断,因为宏只是一团糟.

是否有可能以与函数几乎相同的方式使用宏,通过安全的类型检查,避免典型的陷阱以及编译器提供正确诊断的方式.

  1. 我将以肯定的方式回答这个问题(自动回答).
  2. 我想向您展示我在这个问题上找到的解决方案.
  3. 标准C99将被使用和尊重,以具有统一的背景.
  4. 但是(显然有一个"但是"),它将"定义"人们必须"吃"的某种"语法".
  5. 这种特殊语法旨在最简单地编写,最容易理解和/或处理,最大限度地降低生成错误的程序的风险,更重要的是,从编译器获取正确的诊断消息.
  6. 最后,它将研究两种情况:"非返回值"宏(简单情况)和"返回值"宏(不容易,但更有趣的情况).

让我们快速记住宏生成的一些典型陷阱.

例1

#define SQUARE(X) X*X
int i = SQUARE(1+5);
Run Code Online (Sandbox Code Playgroud)

预期值i:36.真值i:11(宏观扩展:) 1+5*1+5.陷阱!

(典型)解决方案(例2)

#define SQUARE(X) (X)*(X)
int i = (int) SQUARE(3.9);
Run Code Online (Sandbox Code Playgroud)

预期价值i:15.真实价值i:11(宏观扩张后:(int) (3.9)*(3.9)).陷阱!

(典型)解决方案(例3)

#define SQUARE(X) ((X)*(X))
Run Code Online (Sandbox Code Playgroud)

它适用于整数和浮点数,但它很容易被破坏:

int x = 2;
int i = SQUARE(++x);
Run Code Online (Sandbox Code Playgroud)

预期值i:9(因为(2+1)*(2+1)...).真值i:12(宏扩展:((++x)*(++x)),给出3*4).陷阱!

在这里可以找到一种很好的宏检查方法:

但是我想要更多:某种界面或"标准"语法,以及(少量)易于记忆的规则.意图是"能够使用(不实现)宏"与尽可能类似的功能.这意味着:写得好的假函数.

为什么在某种程度上有趣?

我认为这是在C中实现的一个有趣的挑战. …

c macros c99

9
推荐指数
1
解决办法
1683
查看次数

标签 统计

c ×1

c++ ×1

c99 ×1

macros ×1

templates ×1

v8 ×1