Как исправить диск, который может скоро выйти из строя? [Дубликат]

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, это - вид вещи, по поводу которой они волнуются.

6
задан 17.05.2020, 09:18

1 ответ

Никакой путь. УМНЫЙ тестирование оборудования. И Перераспределенные Секторы являются одним из важных. Если значение на самом деле увеличивается, найдите замещающий диск теперь и оставьте этого для неважных данных. Однако у меня есть жесткий диск, который уже имеет этот параметр плохо в течение многих лет, но количество поврежденных секторов не является increaing.

2
ответ дан 17.05.2020, 09:19

Теги

Похожие вопросы