正如标题所说,
一个典型的答案是:
允许任何和所有代码转换不会改变程序的可观察行为的规则
我们会不时地从某些实现中获取行为,这些行为归因于此规则.好多次错了.那么,这个规则究竟是什么呢.标准没有明确地将此规则作为一个部分或段落提及,那么究竟什么属于这条规则的范围?对我来说,这似乎是一个灰色区域,标准没有详细定义.有人可以根据标准的参考资料详细说明细节.
注意:将其标记为C和C++,因为它与两种语言都相关.
有一段时间,需要在C++中使用无操作语句.例如,当实现assert()在非调试配置中禁用时(也请参阅此问题):
#ifdef _DEBUG
#define assert(x) if( !x ) { \
ThrowExcepion(__FILE__, __LINE__);\
} else {\
//noop here \
}
#else
#define assert(x) //noop here
#endif
Run Code Online (Sandbox Code Playgroud)
到目前为止,我的印象是正确的方法是(void)0;用于无操作:
(void)0;
Run Code Online (Sandbox Code Playgroud)
但是我怀疑它可能会在某些编译器上触发警告 - 类似于C4555: expression has no effect; expected expression with side-effectVisual C++警告,这种情况不是针对这种特殊情况发出的,而是在没有强制转换时发出的void.
它普遍便携吗?有没有更好的办法?
我一直认为这是因为许多IDE和语法突出显示工具没有在C中突出显示ASM,但它们总是使用C++.内联汇编是否是C标准(ANSII或ISO)的一部分?