Я изучал C ++ FAQ Lite онлайн. Я снова просматривал inlines, так как я не нашел их использования и хотел знать, как остановлена циклическая зависимость, как показано в этом ответе. Сначала я попытался сделать: «Почему строки лучше, чем определения». пример со следующим кодом:
#define unsafe(i) \
( (i) >= 0 ? (i) : -(i) )
inline
int safe(int i)
{
return i >= 0 ? i : -(i);
}
int f();
int main(void)
{
int x(5);
int ans;
ans = unsafe(x++);
cout << ans << endl;
ans = unsafe(++x);
cout << ans << endl;
ans = safe(x++);
cout << ans << endl;
ans = safe(++x);
cout << ans << endl;
std::cin.get();
return 0;
}
EDIT:
Отлично. Получил опечатку с дороги. Не то чтобы я был огорчен тем, что не нахожу таких ошибок или чего-то еще.
Вывод теперь 6, 9, 9, 11
.
Однако, даже с предварительным увеличением, не должно ли первое значение получить 7?
Если макрос вызывается дважды, то разве это не будет так:
unsafe (x) // предварительное увеличение не изменяет значение при вызове.
unsafe (++ x) // для всех намерений и целей приращение происходит перед вторым вызовом, поэтому ++ x. Это для первого ans = unsafe(x++)
, если он вызывается дважды.
К тому времени, когда мы дойдем до второго ans = unsafe(++x)
, разве х не должен был быть увеличен вдвое? Один раз по двойному вызову и один раз, когда первый двойной вызов был закончен?