1

我正在使用 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 上),它编译得很好。如果我在第十行放任何东西,甚至是注释,编译器都会给我一个错误。有谁知道是什么原因造成的,我该如何解决?

4

2 回答 2

4

在文本文件末尾省略尾随换行符是个坏主意 - 有许多工具将无法正常工作,除非它在那里。(一些文本编辑器甚至会警告你它丢失了。)

尾随换行符是文本文件的标准行为 - 为什么不顺其自然,只放一个。其他人都这样做。8-)

于 2009-09-21T22:34:33.453 回答
0

很久以前,版本 2 左右(1994-ish)的 MSVC++ 无法正确处理文件末尾的“部分”行。例如:

头文件.h

#ifndef __HEADER_H
#define __HEADER_H

void foo();

#endif        // <-- no newline here

主文件

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

在这种情况下,预处理器在解析包含后会看到以下文本:

#ifndef __HEADER_H
#define __HEADER_H

void foo();

#endif#include "other.h"

错误是最后一行将如上所示一起运行,并且"other.h"不会包含该文件。用当时的IDE,很容易不小心创建一个没有尾随换行符的文件,遇到上面的情况。

幸运的是,这个错误早就被修复了。看起来您已经发现了编译器警告它不希望在一行中间遇到文件结尾的情况之一。这通常被认为是一件好事。

于 2009-09-21T22:38:25.007 回答