Tag: c preprocessor

奇怪的宏定义问题

我想在编译时根据另一个宏的值定义一个宏。 但是,此代码未按预期执行: #include #include #include #define SIXTEEN 16 #define TWO (SIXTEEN % 8 == 0)? (SIXTEEN / 8) : ((SIXTEEN / 8) + 1) int main(); int main() { printf(“max = %d\n”, TWO); int i; for (i = 0; i < TWO; i++) { printf("%d\n", i); } return 0; } 这打印: max = 2 0 […]

预处理器包括路径,宏等条目不可用

我无法浏览Eclipse中的项目(Oxygen.3a Release(4.7.3a),CDT版本9.4.3.201802261533)。 该项目已成功构建,但我无法使用ctrl + LMclick追溯许多function。 我尝试从在线资源修复问题,但许多人建议修改预处理器包含路径,宏等的条目,我的项目甚至没有。 这背后的原因是什么,我该如何解决? 出于某种原因,下一个条目(C / C ++包括路径和符号)显示|未找到包含路径“ 当我尝试跟踪一个函数时,我在索引中得到“找不到符号”xyz“。 我已经尝试重建索引器,但它对我不起作用。

在C中取消定义类似函数的宏?

我试图对glibc做一些黑客攻击,我想知道是否有可能重新定义类似函数的宏? 例如, 具有以下宏: #define expm1(Val) __TGMATH_UNARY_REAL_ONLY (Val, expm1) 如何将expm1重新定义为: #define expm1(Val) __TGMATH_UNARY_REAL_IMAG (Val, expm1, cexpm1) 我想我必须取消之前的定义,但我不知道该怎么做。

如何使用C宏(#define)来改变调用而不是原型

我们的应用程序中的旧代码包含对malloc , realloc和free调用。 使用我们更新的代码,我们自己的实现被调用而不是标准的运行时实现。 示例如下所示, #define malloc(s) OurMalloc(s) #define free(p) OurFree(p) 这适用于更新的代码,对于较新的C ++代码,我们只需实现全局的new和delete运算符,因此C ++解决方案更“干净”。 问题是我们现在必须包含第三方库,其中的类包含名称类似malloc和free ,例如 class ABC { public: … void free (char *p); }; 如果类的自由方法具有相同数量的参数,则即使在类定义中,即使在调用没有类ABC的方法时,C / C ++预处理器也只是替换ourFree所有出现的free 。 所以上面的类定义和以下调用: ABC abc; abc.free(p); 被替换为, class ABC { public: … void OurFree (char *p); }; ABC abc; abc.OurFree(p); 哪个可以编译,但当然没有链接。 如果ABC::free具有与标准free不同的参数数量,则编译器仍会发出警告。 我们想避免它们。 一些替代解决方案是: 在第三方包含文件的开头取消定义我们的定义并在以后重新定义它 确保第三方包含文件始终包含在我们自己的定义之前 […]

C Macro保护定义

有没有办法保护宏定义? 更具体地考虑以下内容: #define macro1 x // code segment 1 involving macro1 goes here // code segment 2 involving macro1 goes here // code segment 3 involving macro1 goes here 在示例中,我放置了3条注释,表示涉及宏的代码段。 我现在想做的是能够避免宏影响代码段2.有没有办法告诉编译器替换段1和段3中的所有macro1实例而不是段2中的宏实例? 这是一种可能的方式: #define macro1 x // code segment 1 involving macro1 goes here #undef macro1 // code segment 2 involving macro1 goes here #define macro1 […]

0x0040和管道符号在这里表示什么?

这里SIMPLE_EX2与0x0040进行“或”操作,整个提供作为SIMPLE_EX1的地址。 我的理解是否正确? #define SIMPLE_EX1 (0x0040 | SIMPLE_EX2)

使用函数与宏时,为什么会得到不同的结果?

我正在使用DevCPP IDE,我发现在用c编程时, 返回的值: float f(float x) { return 1/(1+x*x); } 和f(x)返回的值如果定义为: #define f(x) 1/(1+x*x) 是不同的。 为什么我在这些情况下会得到不同的结果? 编辑: 这是我的代码,我得到了exception: main() { int i; float a=0, b=1, h, n=12, s1, s2=0; h=(ba)/n; //step length s1=f(a)+f(b); for(i=1;i<=n-1;i++) { s2+=f(a+(i*h)); } s1=(s1+2*s2)*h/2; printf("sum: %f", s1); getch(); } 输出1:0.693581(使用MACRO) 输出2:0.785109(使用function)

运算符’重载’等效于C / Objective-C中的#define

可能重复: 运算符在C中重载 如果我有一个结构: typedef struct myStruct { … } myStruct; myStruct myStructAdd(myStruct a, myStruct b); 我需要这样的东西: #define myStruct a + myStruct b myStructAdd(a, b) // NOTE this code does NOT WORK. This is what the question is asking. 要使此语法有效: myStruct a; myStruct b; myStruct c = a + b; 有没有办法使用#define来做到这一点? 编辑: 我不是要求+语法的替代品。 我要问的是,是否以及如何使用预处理器在编译时将plus语法重写为标准C语法。 例如#define myStruct […]

是否有一个C预处理器可以消除#ifdefs但还会评估预处理器宏?

我有一个项目,做了很多这个 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,37) // do some legacy stuff #else // do current stuff #endif 其中KERNEL_VERSION定义为 #define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c)) 我想消除与当前版本无关的定义,但像sunifdef这样的工具不会评估KERNEL_VERSION宏,所以类似于 sunifdef –replace -DKERNEL_VERSION\(a,b,c\)=\(\(\(a\)\<\<16\)+\(\(b\)\<\<8\)+\(c\)\) -DLINUX_VERSION_CODE=3.13.1 * 失败了 sunifdef:错误0x04200:参数中的垃圾“-DKERNEL_VERSION(a,b,c)=(((a)<< 16)+((b)<< 8)+(c))” 我该如何解决这个问题?

C预处理器与变量串联

可能重复: C预处理器和连接 是否可以将C预处理器与变量名连接? #define WIDTH 32 int dataWIDTH; // dataWIDTH should be interpreted as ‘data32’ printf(“%d”,dataWIDTH);