只允许在C++中定义行为?

7 c++ gcc g++ visual-c++

是否可以在gcc/g ++或ms c ++中设置仅允许定义行为的标志?所以类似下面的内容给了我一个警告或最好是一个错误

func(a++, a, ++a)
Run Code Online (Sandbox Code Playgroud)

Mar*_*k B 8

特定于标准中指定了未定义和未指定的行为,因为它可能会对实现造成不应有的负担,以诊断其所有示例(或者无法确定).

程序员应该注意避免那些未定义的区域.

对于您所陈述的示例,对于程序员来说,首先不要编写该代码应该是相当明显的.

话虽如此,g++ -Wall将会捕获一些不良代码,例如在非void函数中缺少返回以举一个例子.

编辑:@sehe还指出-Wsequence-point哪个将捕获这个精确的代码构造,尽管在每个参数的评估之间应该有一个序列点(但是未指定参数的评估顺序).


seh*_*ehe 7

GNU C++有以下内容

   -Wsequence-point
       Warn about code that may have undefined semantics because of violations of sequence point rules in the C and C++ standards.
Run Code Online (Sandbox Code Playgroud)

这将正确标记您显示的调用

  -Wstrict-overflow

  -Wstrict-overflow

   -fstrict-aliasing
   -fstrict-overflow
Run Code Online (Sandbox Code Playgroud)

HTH

  • +1.你也可以使用`-Werror = sequence-point`,所以g ++会拒绝编译它. (2认同)