Tag: macros

可以使用代码块作为C宏的参数吗?

我有一个模式,基本上是一些样板代码,其中一部分在中间变化 if(condition){ struct Foo m = start_stuff(); { m.foo = bar(1,2); m.baz = 17; } //this part varies end_stuff(); } 是否可以使宏taht将该中间代码块作为参数? C中宏扩展的规则看起来非常复杂,所以我不确定将来是否会出现任何可能会让我感到困扰的极端情况(特别是,我不明白如果我的代码如何分离宏参数有逗号)。 #define MY_MACRO(typ, do_stuff) do { \ if(condition){ \ struct typ m = start_stuff(); \ do_stuff; \ end_stuff(); \ } \ }while(0) //usage MY_MACRO(Foo, { m.foo = bar(1,2); m.baz = 17; }); 到目前为止,我设法想到的唯一的事情是,如果我在宏中使用循环语句,则会break并continue捕获,这对我的特定用例来说是可接受的权衡。 编辑:当然,如果可以的话,我会使用一些function。 […]

是否在stdlib.h中定义了max(a,b)?

我正在使用两台计算机,每台计算机都有不同版本的visual studio。 在visual studio 2008计算机上,我的代码编译。 在visual 2010计算机上,我的代码无法编译,因为我使用的是宏max(a,b) ,据我所知,它是在stdlib.h中定义的。 我不能只定义max(a,b)因为它将是visual 2008计算机上的重新定义。 但如果我没有定义max(a,b)我的代码就无法在visual 2010计算机上编译。 有解决方案吗

如何在编译时在gcc中显示#define的值

到目前为止,我已经达到了: #define ADEFINE “23” #pragma message (“ADEFINE” ADEFINE) 哪个有效,但是如果ADEFINE不是字符串怎么办? #define ADEFINE 23 #pragma message (“ADEFINE” ADEFINE) 原因: 警告:格式错误的’#pragma message’,被忽略 理想情况下,我希望能够处理任何值,包括undefined。

模拟器/生成的开关语句范围,单位为c

在ac(99?)或Objective C switch语句中是否存在支持范围情况的hack? 我知道不支持写这样的东西: switch(x) case 1: case 2..10: case 11: 但我认为应该有一种使用#define宏生成代码的方法。 当然我可以用一个案例列表来定义一个宏,但我希望有更优雅的方式,如CASERANGE(x,x + 10),它会生成: case x case x+1 case x+2 它甚至可能吗?

如何将用户定义的宏传递给xcodebuild?

我在命令行中通过xcodebuild构建我的项目。 不在xCode中。 我想将一些marc传递给项目,以便它可以影响代码。 如下面的代码: #if (API_TYPE == 1) #define URL_API @”https://dapi.xxx.com/1.1/” #elif (API_TYPE == 2) #define URL_API @”https://tapi.xxx.com/1.1/” #elif (API_TYPE == 3) #define URL_API @”https://api.xxx.com/1.1/” #else #error “API_TYPE value error! should be only value 1,2,3 !” #endif 我想在代码文件之外传递API_TYPE的定义。 比如通过xcodebuild命令。 但它不像这样工作: xcodebuild -sdk xxx -target xxx SYMROOT=${XCSYMROOT} API_TYPE=${APITYPE} API_TYPE的值未更改。 但是SYMROOT的价值发生了变化。 那么我该如何实现将值传递给API_TYPE呢?

C11的__STDC_VERSION__值是多少?

我知道编译器使用__STDC__来表示编译器是标准C,并且从那里,您可以使用__STDC_VERSION__来确定您正在使用的标准级别 。 我也知道C90没有价值,C90修正案1有199401L而C99有199901L 。 最新的C1x草案我简单地说它是201ymmL ,我假设它在最终标准中的价值不那么“模糊”。 我的猜测是,自从C11被批准以来,它将是201112L ,但我想确定一下。 我以为我可以尝试使用gcc -std=c1x但我正在运行的gcc版本还不支持。 有谁知道实际价值是多少?

sizeof(int )是什么意思?

我是Linux内核的新手。 我正在读取文件ioctl.h ,在那里我遇到了一个宏_IOC_TYPECHECK(t) ,它看起来像这样: #define _IOC_TYPECHECK(t) \ ((sizeof(t) == sizeof(t[1]) && \ sizeof(t) < (1 << _IOC_SIZEBITS)) ? \ sizeof(t) : __invalid_size_argument_for_IOC) 你能解释一下这段代码吗? 在这段代码中, sizeof(t[1])是什么意思?

将字符串文字与char文字连接起来

我想连接一个字符串文字和char文字。 在语法上不正确, “abc” ‘d’ “efg”呈现编译器错误: xc:4:24:错误:预期’,’或’;’ 在’d’之前 到现在为止,我必须使用snprift(不必要),尽管字符串文字的值和编译时知道的char文字。 我试过了 #define CONCAT(S,C) ({ \ static const char *_r = { (S), (C) }; \ _r; \ }) 但它不起作用,因为S的空终止符未被剥离。 (除了给出编译器警告。) 有没有办法编写一个宏来使用 “abc” MACRO(‘d’) “efg”或 MACRO1(MACRO2(“abc”, ‘d’), “efg”)或 MACRO(“abc”, ‘d’, “efg”) ? 如果有人问我为什么要这样:char文字来自一个库,我需要将字符串作为状态消息打印出来。

可以用变量体定义类似函数的宏吗?

我一直在寻找用于定义宏的GCC文档 ,它看起来像我想要的是不可能的,但我想如果是的话,这里有人会知道。 我想要做的是定义这个宏: synchronized(x) { do_thing(); } 其中扩展为: { pthread_mutex_lock(&x); do_thing(); pthread_mutex_unlock(&x); } 在C ++中,我可以创建一个SynchronizedBlock对象,在其构造函数中获取锁定并在析构函数中解锁,但我不知道如何在C中执行此操作。 我意识到我可以使用synchronized(x, &myfunction);forms的函数指针synchronized(x, &myfunction); ,但我的目标是使一些C代码看起来尽可能像Java。 是的,我知道这是邪恶的。

编译时的偏移量

有没有办法在编译时找到结构成员的偏移量? 我希望创建一个包含结构成员偏移量的常量。 在以下代码中, offsetof()宏在第一个printf语句中起作用。 但是,在第10行中使用声明ofs产生错误: “无法解析’ – >’运算符作为常量表达式”。 这样做还有其他方法吗? struct MyStruct { unsigned long lw; unsigned char c[5]; int i; int j; unsigned long last; }; const int ofs = offsetof(struct MyStruct, i); // This line in error int main(void) { printf(“Offset of c = %d.\n”, offsetof(struct MyStruct, c) ); printf(“Offset of i = %d.\n”, […]