gpt4 book ai didi

带有运算符解释的 C 宏

转载 作者:行者123 更新时间:2023-12-01 12:26:31 25 4
gpt4 key购买 nike

我想知道传递给宏的运算符是如何工作的。它们是来自 glib 源 (glib/testutils.h) 的宏。

在代码中,您使用 assert 作为 g_assert_cmpint(1, ==, 2);,因此运算符按原样传递。这个怎么运作? # 标记在此宏中的含义是什么?

#define g_assert_cmpint(n1, cmp, n2)                  \
G_STMT_START { \
gint64 __n1 = (n1), __n2 = (n2); \
if (__n1 cmp __n2) ; \
else \
g_assertion_message_cmpnum( \
G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, \
#n1 " " #cmp " " #n2, __n1, #cmp, __n2, 'i'); \
} G_STMT_END

g_assert_message_cmpnum有这样的接口(interface):

void g_assertion_message_cmpnum(const char *domain, \
const char *file,\
int line,\
const char func,\
const char *expr,\
long double arg1, \
const char *cmp,\
long double arg2,\
char numtype);

这是否意味着 #cmp 运算符转换为字符串?

但是如何从宏中理解这一行 #n1 ""#cmp ""#n2

最佳答案

因为宏是在编译之前处理的(预处理器阶段)。所以它会简单地用传递的运算符“替换” cmp 。使用“宏”是不安全的,因为它不执行类型检查。

示例如下:

#define DOUBLE(x) x << 1 /// shift 1 bit left = multiple by 2

cout << DOUBLE(5) << endl; /// result "51" instead of "10"
/// because the result of processed code is:
cout << 5 << 1 << endl;

关于带有运算符解释的 C 宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39071956/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com