相关疑难解决方法(0)

在什么版本的C中,括号内的块用于返回有效的值?

如果我做:

int j = ({int x = 7; x+3;});
Run Code Online (Sandbox Code Playgroud)

在i686-apple-darwin10-gcc-4.2.1(GCC)4.2.1(Apple Inc. build 5646)gcc它编译得很好.有问题的块({int x = 7; x+3;})返回最后一个语句的值作为块的值.如果删除括号,则无法编译.我能指望这在大多数C编译器中都能使用吗?

另外,这个结构的名称是什么?我在搜索它时遇到了很多麻烦,因为搜索引擎没有索引()或者{}C是一个糟糕的搜索词.我也无法在任何书中找到任何关于它的内容,可能是因为我不知道该找什么.

c

18
推荐指数
3
解决办法
3710
查看次数

在宏中使用({...})括号来吞下分号

通常,在宏中,您会看到人们使用a do { ... } while(0)来吞下分号.我刚刚遇到了一个他们使用的例子({ ... }),它似乎不仅吞下了分号,而且似乎也允许你返回一个值:

#define NEW_MACRO()  ({ int x = 1; int y = 2; x+y; })

 if(1) 
   val = NEW_MACRO(); 
 else 
   printf("this never prints");`
Run Code Online (Sandbox Code Playgroud)

val会出来3.我找不到任何关于它的文档,所以我对它有点警惕.这种方法有什么问题吗?

c macros

6
推荐指数
1
解决办法
2588
查看次数

模拟 GCC 语句表达式

我被迫使用 IAR EW430 编译器 v7.12 用于嵌入式项目,它只正式支持 c99。

我希望能够通过任何方式以通用方式模拟 GCC 的语句表达式,而不是编写一堆专用的内联函数。

有没有办法实现这一目标?(也许使用 MACRO-wizardry?或者模拟 Lambda,或者一些允许这样做的隐藏编译器开关?)显然不是改变编译器。

具体来说,复合表达式的最后一条语句的结果应该同时携带其类型和值,而不是作为宏参数传入的那些。

我已经搜索了几个月,但我能得到的最接近的是令人印象深刻的图书馆,但这似乎是一个非常多的东西。

c lambda closures c99 c-preprocessor

2
推荐指数
1
解决办法
824
查看次数

标签 统计

c ×3

c-preprocessor ×1

c99 ×1

closures ×1

lambda ×1

macros ×1