Tag: c preprocessor

C ++宏中“##”的含义是什么?

以下“##”的含义是什么? #define CC_SYNTHESIZE(varType, varName, funName)\ protected: varType varName;\ public: inline varType get##funName(void) const { return varName; }\ public: inline void set##funName(varType var){ varName = var; }

print_once,它是如何阻塞的?

我试图理解实现一次打印function,这段代码工作正常; 但是我无法理解一些事情:1)这是如何阻塞的? 也许我无法正确清除它,但只是想知道, C的哪些属性会让这种情况发生? 1 #include 2 3 #define _TRACE_ 4 5 #ifdef _TRACE_ 6 #define print_once(fmt, …) \ 7 ({ \ 8 static bool __print_once=false; \ 9 if(!__print_once) { \ 10 __print_once = true; \ 11 do { \ 12 printf(fmt, ##__VA_ARGS__); \ 13 }while(0); \ 14 } \ 15 }) 16 #else 17 […]

C中的宏定义错误?

#define SOUND_SPEED 0.034; int rtt; //round trip time in microsecond double distance; distance = (double)(rtt*SOUND_SPEED)/2; 它抱怨错误:在’/’标记之前的预期表达。 是不是因为我不能使用宏来定义小数或什么?

令人困惑的MACRO和枚举定义

我正在浏览一些Route netlink源代码。 我想弄清楚RTNLGRP_NEIGH的价值是什么 资料来源: http : //lxr.free-electrons.com/source/include/linux/rtnetlink.h?v = 2.6.35#L550 541 /* RTnetlink multicast groups */ 542 enum rtnetlink_groups { 543 RTNLGRP_NONE, 544 #define RTNLGRP_NONE RTNLGRP_NONE 545 RTNLGRP_LINK, 546 #define RTNLGRP_LINK RTNLGRP_LINK 547 RTNLGRP_NOTIFY, 548 #define RTNLGRP_NOTIFY RTNLGRP_NOTIFY 549 RTNLGRP_NEIGH, 550 #define RTNLGRP_NEIGH RTNLGRP_NEIGH 551 RTNLGRP_TC, 552 #define RTNLGRP_TC RTNLGRP_TC 553 RTNLGRP_IPV4_IFADDR, 554 #define RTNLGRP_IPV4_IFADDR RTNLGRP_IPV4_IFADDR […]

如何逐步看宏扩展?

似乎Eclipse允许用户通过按F2“逐步查看扩展”。 我喜欢这个很棒的function。 但是我可以用gcc或clang (或任何工具)做同样的事情吗? -E选项使所有宏完全展开。 所以我没有找到任何替代方法来逐步扩展宏。 Eclipse很大。 我希望我不需要在任何地方安装它并一直启动它。

#if是否将未定义的符号常量假设为0是标准的?

在这个c程序中 #include int main() { #if UnDefinedSymbolicConstant==0 printf(“UnDefinedSymbolicConstant is equal to 0\n “); #else printf(“UnDefinedSymbolicConstant is not equal to 0\n”); #endif return 0; } UnDefinedSymbolicConstant在任何地方都没有#define ,仍被假定为0并将gcc-4.3.4的输出作为: UnDefinedSymbolicConstant is equal to 0 那么, 这是标准的行为还是只在gcc中才这样?

为什么stddef.h不在/ usr / include中?

我编译了gnu标准库并将其安装在$GLIBC_INST 。 现在,我尝试编译一个非常简单的程序(只使用一个#include: #include ): gcc –nostdinc -I$GLIBC_INST/include foo.c 编译(预处理器?)告诉我,它没有找到stddef.h 。 事实上, $GLIBC_INST/include没有(在/usr/include也没有)。 但是,我在/usr/lib/gcc/x86_64-unknown-linux-gnu/5.3.0/include找到了一个stddef.h 。 为什么该文件不在/usr/include ? 我认为它属于标准c库,应该安装在$GLIBC_INST/include 。 如果没有stddef.h我怎么能用新安装的标准库编译我的foo.c ? 编辑:澄清 我觉得这个问题的标题不是最优的。 正如一些答案所指出的那样, stddef.h不需要在/usr/include (或者$GLIBC_INST/include ,就此而言)。 我明白这一点。 但是我想知道当我想使用$GLIBC_INST时我该怎么$GLIBC_INST 。 我似乎很明显(虽然我可能在这里错了)我需要使用–nostdinc调用gcc以便不使用系统安装的头文件。 这需要我使用-I$GLIB_INST/include 。 这对我来说很清楚。 然而,我还不清楚的是:当我还添加-I/usr/lib/gcc/x86…./include ,我怎么能确定我确实拥有新编译的glibc的最新头文件?

通过在c 中平方宏SQR而感到困惑

这个问题在模拟面试中被问到了……真的很惊讶地找到了尴尬的答案…… 考虑一个宏: #define SQR(x) (x*x) 例1: SQR(2) //prints 4 例2: 如果给出SQR(1 + 1),它不会将(1+1)加到2而是…… SQR(1+1) //prints 3 尴尬吧? 是什么原因? 这段代码是如何工作的? 注意:我搜索了SO,但找不到任何相关问题。 如果有任何好评请分享!

C / C ++ #define宏内宏?

我想要像: #define C_OR_CPP(C__, CPP__) #ifdef __cplusplus\ CPP__\ #else\ C__\ #endif 可能吗? 也许#include有些肮脏的黑客? 原因:我创建了一个头部,其中一个结构使用了一个类型为vector*的成员变量,但是在C中我希望​​它只是void* ,你知道。 TIA

被#define和typedef混淆

#define T Stack_T typedef struct T *T; 那么struct T是什么意思,# #define或typedef定义的那个?