Я подозреваю, что это может вызывать предупреждения на некоторых компиляторах
Маловероятно, поскольку ((void)0)
- это то, к чему расширяется стандартный макрос assert
, когда определяется NDEBUG
.Таким образом, любой компилятор, который выдает предупреждения для него, будет выдавать предупреждения всякий раз, когда код, содержащий утверждения, компилируется для выпуска.Я ожидаю, что это будет сочтено ошибкой пользователей.
Полагаю, компилятор мог бы избежать этой проблемы, предупредив о своем предложении (void)0
, в то время как специально обработал только ((void)0)
.Таким образом, вам может быть лучше использовать ((void)0)
, но я сомневаюсь в этом.
В общем, бросание чего-либо в пустоту, с дополнительными включающими в себя скобками или без них, идиоматически означает «игнорировать это».Например, в коде C, который преобразует параметры функции в void
, чтобы подавить предупреждения для неиспользуемых переменных.Так что в этом отношении компилятор, который предупреждал, был бы довольно непопулярным, так как подавление одного предупреждения просто дало бы вам другое.
Обратите внимание, что в C ++ стандартные заголовки разрешают включать друг друга.Поэтому, если вы используете любой стандартный заголовок, assert
может быть определено этим.Таким образом, ваш код является непереносимым для этой учетной записи.Если вы говорите «универсально переносимый», вы обычно должны рассматривать любой макрос, определенный в любом стандартном заголовке, как зарезервированный идентификатор.Вы могли бы отменить его, но использование другого имени для ваших собственных утверждений было бы более разумным.Я знаю, что это только пример, но я не понимаю, почему вы когда-нибудь захотите определить assert
«универсально переносимым» способом, поскольку во всех реализациях C ++ он уже есть, и он не делает то, что выопределяя это здесь.