Обратная косая черта в конце предупреждения файла

С помощью этого кода:

#include <iostream>


int main(int argc, char *argv[])
{

  return 0;
}


/** run2: A macro to call a function. */
#define run2( function, ctype, dim ) \
if ( operation == #function ) \
{ \
  if ( componentType == #ctype && Dimension == dim ) \
  { \
    typedef itk::Image< ctype, dim > ImageType; \
    function< ImageType >( inputFileName, outputFileName, radius, algorithm, useCompression ); \
    supported = true; \
  } \
}

Я получаю предупреждение: backslash-newline в конце файла

Любая идея, как это сделать?

Дэвид

Ответ 1

Проблема заключается в том, что в конце кода нет символа новой строки. С++ Standard & sect; 2.1/2 говорит:

<... > Если исходный файл, который не является пустой не заканчивается в новой строке символ или заканчивается в новой строке персонажу, которому предшествует символ обратной косой черты, поведение undefined.

Ответ 2

Если ваш файл (единица перевода) не заканчивается в новой строке, это undefined поведение, что означает, что поведение вашей программы становится непредсказуемым. Хотя в С++ 11 это изменяется, и предварительный процессор будет вести себя так, как если бы была новая строка.

Интересно отметить, почему это проблема, мы можем из проекта pre С++ 11, который включает в себя файл через include, имеет следующий эффект из раздела 16.2 Включение исходного файла, в котором говорится:

Директива предварительной обработки формы

 # include " q-char-sequence" new-line

вызывает замену этой директивы всем содержимым исходный файл, идентифицированный с помощью определенной последовательности между " разделители.

поэтому, если включенные файлы не заканчиваются в новой строке, как мы должны иметь дело с объединенной последней строкой включенного файла и последующей строкой в ​​исходном коде? Существует несколько очевидных проблем, например, если последняя строка во включенном файле заканчивается:

  • в комментарии
  • в продолжении
  • в определении макроса

он изменит способ интерпретации исходного файла с использованием include, который не является желательной функцией. Это также описано в New C Standard (C также имеет то же правило), и он говорит:

Каким должно быть поведение, если последняя строка включенного файла не заканчивается в новой строке? Если символы в начале строки после Директива #include считается частью любого предшествующего токена предварительной обработки (из последней строки включенного файла)? Или возможно, исходные файлы должны рассматриваться как содержащие неявную новую строку в конце. Это требование упрощает ситуацию, проводя поведение undefined

Для полноты, pre С++ 11 в проекте стандартного раздела 2.1 Фазы перевода говорят (акцент мой идет вперед):

[...] Если исходный файл, который не является пустым , не заканчивается в новой строке символ или заканчивается символом новой строки, которому предшествует символ обратной косой черты, поведение undefined.

и С++ 11 draft standard говорит:

[...] Исходный файл, который не пуст, и который не заканчивается new-line character, или который заканчивается символом новой строки сразу перед символом обратной косой черты перед любым таким сращиванием место должно обрабатываться так, как если бы новый символ новой строки был прилагается к файлу.

Ответ 3

Следующий код генерирует то же предупреждение в g++ 4.3.4 и g++ 4.5.1:

int main() {}
#define X \
Y

Я должен сказать, что я не понимаю, почему. Но вы можете избавиться от предупреждения, добавив пустую строку в конец файла.

Кстати, это компилируется без предупреждения, даже без пустой последней строки:

int main() {}
#define X Y

Итак, это похоже на ошибку перед процессором.

Отредактировано для добавления: ОК, а не как ошибка. См. Мой другой ответ для более продуманного мнения.

Ответ 4

Угадайте, что вам не хватает, это новая строка, следующая за окончательной скобкой закрытия. Это разумно для компилятора, чтобы предупредить об этом (стандарты C и С++ говорят, что он дает поведение undefined), но текст сообщения вводит в заблуждение относительно источника проблемы.

Ответ 5

Может быть, последняя строка в вашем файле не заканчивается символом новой строки? Последняя редакция в конце файла требуется, но есть редакторы, которые просто для удовольствия быть раздражающими не пишут (визуальная студия IIRC).

Ответ 6

Как отметил Кирилл В. Лядвинский, текущий стандарт настаивает на новой строке в конце каждого исходного файла. К счастью, поведение на несоответствующем входе undefined, поэтому компиляторы могут игнорировать это глупое правило. В основном они это делают. Но стандарт оставляет предварительный процессор бесплатным, чтобы отклонить такие случаи, и вы, похоже, наткнулись на такой случай. Неужели g++ не отвергает его из pique? Так что это должно быть (не ошибка, потому что стандарт позволяет это, но) непреднамеренное поведение.

Хорошей новостью является то, что С++ 11 делает это правильно:

2.2 Фазы перевода
Исходный файл, который не является пустым и это не заканчивается новой строкой символа или заканчивается новой строкой персонажу, которому предшествует символ обратной косой черты перед любым таким происходит сплайсинг, обрабатывается как новая новая строка символ добавлен в файл.

Итак, ваш код будет компилироваться в ближайшем будущем.