do ... while
и if ... else
там для создания его так, чтобы точка с запятой после макроса всегда означала то же самое. Скажем, у Вас было что-то как Ваш второй макрос.
#define BAR(X) f(x); g(x)
Теперь, если необходимо было использовать BAR(X);
в if ... else
оператор, где тела, если бы оператор не был обернут в фигурные скобки, Вы получили бы плохое удивление.
if (corge)
BAR(corge);
else
gralt();
вышеупомянутый код расширился бы в [1 124]
if (corge)
f(corge); g(corge);
else
gralt();
, который является синтаксически неправильным, поскольку еще больше не связывается с если. Это не помогает обернуть вещи в фигурные скобки в рамках макроса, потому что точка с запятой после фигурных скобок является синтаксически неправильной.
if (corge)
{f(corge); g(corge);};
else
gralt();
существует два способа решить проблему. Первое должно использовать запятую для упорядочивания операторов в рамках макроса, не отнимая у него его способность действовать как выражение.
#define BAR(X) f(X), g(X)
вышеупомянутая версия панели BAR
разворачивает вышеупомянутый код в то, что следует, который синтаксически корректен.
if (corge)
f(corge), g(corge);
else
gralt();
Это не работает, если вместо [1 113] у Вас более сложное тело кода, который должен войти в его собственный блок, сказать, например, для объявления локальных переменных. В наиболее общем случае решение состоит в том, чтобы использовать что-то как [1 114], чтобы заставить макрос быть отдельным оператором, который берет точку с запятой без беспорядка.
#define BAR(X) do { \
int i = f(X); \
if (i > 4) g(i); \
} while (0)
Вы не должны использовать do ... while
, Вы могли приготовить что-то с [1 116] также, хотя, когда if ... else
расширяется в if ... else
, это еще приводит к" свисание ", который еще мог сделать существующее свисание проблемой еще тяжелее для нахождения, как в следующем коде.
if (corge)
if (1) { f(corge); g(corge); } else;
else
gralt();
точка должна израсходовать точку с запятой в контекстах, где повисшая точка с запятой ошибочна. Конечно, это могло (и вероятно должен), будьте обсуждены в этой точке, которую было бы лучше объявить BAR
как фактическая функция, не макрос.
, Таким образом, эти do ... while
там для работы вокруг недостатков препроцессора C. Когда те руководства по стилю C говорят Вам откладывать препроцессор C, это - вид вещи, по поводу которой они волнуются.
Никакой путь. УМНЫЙ тестирование оборудования. И Перераспределенные Секторы являются одним из важных. Если значение на самом деле увеличивается, найдите замещающий диск теперь и оставьте этого для неважных данных. Однако у меня есть жесткий диск, который уже имеет этот параметр плохо в течение многих лет, но количество поврежденных секторов не является increaing.