- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
#ifndef __MAKROS_H__
#define __MAKROS_H__
// ...
#define countof( array ) sizeof( array ) / sizeof( array[ 0 ] )
#define IS_CLUSTER( id ) id >= FIRST_CLUSTER_ID
#define CREATE_TEMP_FILE( autoclean_name, file_prefix ) \
char create_temp_file_file_mask[ MAX_PARAM_STR_LENGTH ]; \
snprintf( create_temp_file_file_mask, MAX_PARAM_STR_LENGTH, "%s/%sXXXXXX", config::tmp_path, file_prefix ); \
int create_temp_file_desc=mkstemp( create_temp_file_file_mask ); \
if(create_temp_file_desc<0) \
{ \
DEBUG_E( Interface, "Cannot create temporary file: %s\n", create_temp_file_file_mask ); \
ret=RET_CANTOPENFILE; \
CHECK_RET(sock, ret); \
return true; \
} \
close(create_temp_file_desc); \
autoclean autoclean_name( create_temp_file_file_mask );
#endif // __MAKROS_H__
это были KDEшники?
>while (0)
Студия начнет выть про константы в условиях цикла.
do {} while (0); более чем распространенная схема, например, заменяющая кучку goto error;
Чтобы вызов такого макро работал как вызов самой обычной функции, и требовал ";" после себя, а также нормально интегрировался с ифами и другими управляющими конструкциями. Классика макроебства же.
1) Все аргументы заворачиваем в круглые скобки
2) Если пишем выражение - оборачиваем всего макро круглые скобки
3) Если пишем стейтмент - оборачиваем его в do { ... } while (0)
> Студия начнет выть про константы в условиях цикла.
И пошла она нахуй со своим вытьем. Лучше бы полезные ворнинги показывала.
P.S. А с {} она всяко будет вопить про лишнюю ";".
P.P.S. На while (true) { ... if (x) break; ... } тоже воет? Если да - то говно эта ваша вижуалка.
Так тут же тоже константа в условии. Почему на тот случай она вопит а на этот нет? Вот срань то...
На while (true) { ... if (x) break; ... } тоже воет? Это ведь вполне нормальная конструкция. Да и нолик в условии\цикле, появившийся в результате макроэкспанда или вычисления констант тоже как бы нормальная практика.
пока дерьмотюнинг не сделаешь -D_SCL_SECURE_NO_WARNINGS она и на /W3 будет изрыгать тонны проклятий в адрес std::copy
В плюсах нет возможности отключить определенный ворнинг в определенном месте. Есть конечно pragma, но оно же прибито к крестокомпилятору
слава микрософту
Вот у визуалки хороший компилятор - быстрый, код получается компактней чем у гцц. Простим уж ей неподдержку С99... Но с ворнингами у нее полная жопа. Те, которые надо, она не показывает. Ненужные - пожалуйста, тысячами. Вот кому нахуй сдались ворнинги про "устаревание" "небезопасных" сишных функций, и предложение взамен юзать анально огороженную замену от майкрософта? Кому интересны сотни ворнингов в хедерах самой визуалки? Даже опенсурсное gcc их по дефолту не показывает, зная, что никто их править не будет.
а вот неподдерджку С++11 уже прощать не хочется. А в экспериментальной ветке gcc есть даже концепты
Никак группу КРЕМАТОРИЙ переслушал? Притом такая редкая запись.
>#define countof( array ) sizeof( array ) / sizeof( array[ 0 ] )
я про экранирование (array)
Вот тут зачем вторые?