Почему MSVC ++ выдает ошибку, если я пытаюсь скомпилировать заголовок во включении без перевода строки? (C ++ / Windows) - PullRequest
1 голос
/ 22 сентября 2009

Я использую MSVC ++ для программирования простого окна, и я включил файл ресурсов для меню следующим образом:

MYMENU MENU DISCARDABLE
//etc.

и я создал заголовочный файл "resourcedef.h" с такими определениями, как

#define ID_MYMENU_FILE_CLOSE 1002

Я могу включить его в свой файл main.cpp без ошибок, однако, когда я включаю его в файл ресурсов, я получаю сообщение об ошибке

.\resourcedef.h(9) : fatal error RC1004: unexpected end of file found

(resourcedef.h ровно в 9 строк). Когда я добавляю перевод строки в конце .h,

//lines 1 - 8
#define ID_MYMENU_FILE_OPEN 1001

Так что есть десятая пустая строка (которая не отображается на SO), она компилируется нормально. Если я добавлю что-нибудь в десятую строку, даже комментарий, компилятор выдаст мне ошибку. Кто-нибудь знает, что вызывает это и как я могу это исправить?

Ответы [ 2 ]

4 голосов
/ 22 сентября 2009

Это плохая идея, чтобы пропустить завершающий перевод строки в конце текстового файла - есть много инструментов, которые не будут работать должным образом, если его там нет. (Некоторые текстовые редакторы даже предупредят вас, что этого не хватает.)

Конечные символы новой строки являются стандартным поведением для текстовых файлов - почему бы не пойти с потоком и просто поставить его там. Все остальные делают. 8 -)

0 голосов
/ 22 сентября 2009

Давным-давно MSVC ++ версии 2 или около того (выпуск 1994 г.) не обрабатывал «частичные» строки в конце файла должным образом. Например:

header.h

#ifndef __HEADER_H
#define __HEADER_H

void foo();

#endif        // <-- no newline here

main.cpp

#include "header.h"
#include "other.h"

В этой ситуации препроцессор увидит следующий текст после разрешения:

#ifndef __HEADER_H
#define __HEADER_H

void foo();

#endif#include "other.h"

Ошибка заключалась в том, что последняя строка работала вместе, как показано выше, и файл "other.h" не был бы включен. В то время в среде IDE было легко случайно создать файл без завершающей строки и столкнуться с описанной выше ситуацией.

К счастью, эта ошибка давно исправлена. Похоже, вы нашли одну из ситуаций, когда компилятор предупреждает, что не ожидает встречи с концом файла в середине строки. Обычно это считается хорошей вещью.

...