相关疑难解决方法(0)

C多行宏:do/while(0)vs scope block

可能的重复:
当我们定义一个宏时,do(0)有什么用?
为什么在C/C++宏中有时会出现无意义的do/while和if/else语句?
做{...}而(0)有什么好处?

我已经看到一些包含在do/while(0)循环中的多行C宏,如:

#define FOO \
  do { \
    do_stuff_here \
    do_more_stuff \
  } while (0)

与使用基本块相反,以这种方式编写代码有什么好处(如果有的话):

#define FOO \
  { \
    do_stuff_here \
    do_more_stuff \
  }

c macros multiline

173
推荐指数
1
解决办法
10万
查看次数

是否有编译器提示GCC强制分支预测始终以某种方式?

对于英特尔架构,是否有一种方法可以指示GCC编译器生成的代码总是强制分支预测在我的代码中采用特定方式?英特尔硬件是否支持此功能?那么其他编译器或硬件呢?

我会在C++代码中使用它,我知道我希望快速运行的情况,并且不关心当另一个分支需要被采取时,即使它最近采用了该分支.

for (;;) {
  if (normal) { // How to tell compiler to always branch predict true value?
    doSomethingNormal();
  } else {
    exceptionalCase();
  }
}
Run Code Online (Sandbox Code Playgroud)

作为Evdzhan Mustafa的后续问题,该提示是否可以在处理器第一次遇到指令时指定一个提示,所有后续的分支预测都能正常运行?

c++ gcc intel pragma branch-prediction

113
推荐指数
7
解决办法
2万
查看次数

将0转为无效

在我的C++实现(Visual Studio 2008实现)中,我看到以下行 <cassert>

#ifdef  NDEBUG
#define assert(_Expression) ((void)0)
Run Code Online (Sandbox Code Playgroud)

我不明白需要将0转换为void.在我看来,这

#ifdef  NDEBUG
#define assert(_Expression) (0)
Run Code Online (Sandbox Code Playgroud)

甚至简单地说

#ifdef  NDEBUG
#define assert(_Expression) 0
Run Code Online (Sandbox Code Playgroud)

考虑到assert(expr)可以使用的背景,会做什么.

那么,什么是类型的0危险INT而不是类型0 无效在这种情况下?任何现实的例子?

c c++ macros void

11
推荐指数
1
解决办法
3003
查看次数

标签 统计

c ×2

c++ ×2

macros ×2

branch-prediction ×1

gcc ×1

intel ×1

multiline ×1

pragma ×1

void ×1