如果我有一个宏,
#define ABORT(msg) AbortHelper(__FILE__, __LINE__).Report(msg)
字符串
是否保证在msg
被求值之前调用AbortHelper::AbortHelper(const char*, long)
?这很重要,因为我想确保如果像ABORT(GenerateAbortMsg());
这样的语句被求值,程序将在该行中止,即使GenerateAbortMsg()
抛出异常(通过让AbortHelper::~AbortHelper
调用abort
或等效函数来实现)。
我对C++标准的所有版本的答案都很感兴趣(如果它们不同的话)
1条答案
按热度按时间imzjd6km1#
cppreference.com对evaluation ordering规则的总结足以直接回答这个问题。
在C11之前的基于序列点的规则在这里不给予你任何保证。这里唯一的序列点是在完整表达式的末尾,在函数调用参数的计算和函数调用之间,以及从函数返回时(相对于返回值)。
否则,基于序列点的规则不会指定完整表达式的任何特定求值顺序。完整表达式的不同部分可以按任何顺序求值。
C11的sequence-before规则,以及以后的规则,也不会给予你任何希望。关于函数调用,它们类似于C++11之前的规则,在函数参数求值、函数调用本身和函数返回值方面指定了功能上类似的规则。
TLDR:没有。