带有运算符解释的 C 宏
C macros with operator explanation
我想知道传递给宏的运算符是如何工作的。它们是来自 glib 源 (glib/testutils.h
) 的宏。
在代码中,您将断言用作 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
有这样的接口:
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
?
因为宏是在编译时间之前处理的(预处理器阶段)。所以它只会 "replaced" cmp 与传递的运算符。
使用 "macros" 是不安全的,因为它不执行类型检查。
示例如下:
#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;
是 #
在预处理器中是 "stringification"。
然后,在预处理后的后期阶段,所有相邻的字符串文字被连接成一个大字符串。
我想知道传递给宏的运算符是如何工作的。它们是来自 glib 源 (glib/testutils.h
) 的宏。
在代码中,您将断言用作 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
有这样的接口:
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
?
因为宏是在编译时间之前处理的(预处理器阶段)。所以它只会 "replaced" cmp 与传递的运算符。 使用 "macros" 是不安全的,因为它不执行类型检查。
示例如下:
#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;
是 #
在预处理器中是 "stringification"。
然后,在预处理后的后期阶段,所有相邻的字符串文字被连接成一个大字符串。