一个关于#include的问题

解决.rc文件中#include被删除问题
本文介绍了解决Visual Studio资源文件(.rc)中#include指令被删除的方法。通过使用预处理器条件编译,可以在不影响资源编译的同时,避免AppStudio编辑器移除自定义的头文件引用。
一个关于#include的问题
赵湘宁
问题:
    我试图将一个头文件包含在工程的资源文件中。为此在.rc文件中添加了如下一行代码:

#include "MyFile.h"

虽然运行没有问题,但是每次在Visual Studio中打开资源时,它都把这一行代码删除掉了。我之所以要包含这个头文件是因为想使用第三方定义的菜单项ID号。

解答:
    讨厌的IDE环境有时总是以刁难你的代码为乐趣,你说是不是?请不要怕,莫高一尺、道高一丈,对于这种问题总是有办法解决它的。在打开.rc文件的时候,App Studio(Visual Studio资源编辑器的老名称)自己要对这个文件作一些处理。在存储文件时,它并不重新产生这个文件并另存。特别是App Studio喜欢有一个而且只有一个头文件来包含所定义的全部资源符号。通常,这个文件叫resource.h,但是你可以通过在MyApp上单击右键并选择“Resource Includes”(资源包含)来改变这个文件的名字。当App Studio写入资源文件的时候,它产生一个而且只产生一个#include语句。任何用手东方式敲入的附加的#include都会像前面那样被删掉。
图八 对话框边空(Dialog Margins)
是否能对它进行处理呢?当然可以。你可能注意到了App Studio将自己专用的信息嵌入到资源文件中。例如,你可能创建了一个带边空的对话框(如图八)。你是否知道App Studio将边空尺寸存在哪了吗?并没有存在对话框的语句中,因为它没有MARGINS选项。其实,App Studio将这些信息存在了一个特殊的段中:
//#ifdef APSTUDIO_INVOKEDGUIDELINES DESIGNINFO DISCARDABLE BEGIN    IDD_MYDIALOG, DIALOG    BEGIN        LEFTMARGIN, 8        RIGHTMARGIN, 502        TOPMARGIN, 8        BOTTOMMARGIN, 273    ENDEND#endif // APSTUDIO_INVOKED//
       APSTUDIO_INVOKED是在当App Studio 处理.rc文件时定义的,而不是在通常资源编译器编译它的时候定义的。资源编译器根本就不会明白“GUIDELINES”的意思;只有App Studio才会明白。为什么#include的问题会牵扯到“GUIDELINES”呢?因为这个问题的答案依赖于APSTUDIO_INVOKED。你要做的全部工作只是将要包含的文件一下面的形式#include就可以了:
//#ifndef APSTUDIO_INVOKED // if NOT defined#include "MyOtherHeader.h"#endif//
    App Studio在运行时,因为定义了APSTUDIO_INVOKED,所以它忽略掉你的#include。但当没有定义APSTUDIO_INVOKED时,RC编译器就会编译你#include的文件。此外——也是最重要的一点——App Studio在它存储你的.rc文件时会保护你的#include语句。它识别: “这里的这个#ifndef块不是我的,所以我想最好还是不删除它...”
    如果你的好奇心想知道为什么App Studio总是要删除开始那样添加的代码——那是另外一个故事! 我们下次再讲吧。



非常好的问题! 你提到的: ```cpp #include #include ``` 这段代码 **是不完整和错误的 C++ 代码**。我们来详细解释一下: --- ### 一、`#include` 是什么? `#include` 是 C++(以及 C)中的一个 **预处理指令**,它的作用是让编译器在编译之前,把指定的文件内容 **复制到当前文件中**。 --- ### 二、为什么 `#include` 后面必须跟一个头文件? `#include` 必须指定一个头文件,格式如下: ```cpp #include <头文件名> // 标准库头文件,例如 <iostream> #include "头文件名" // 用户自定义头文件,例如 "mystring.h" ``` #### 示例: ```cpp #include <iostream> // 标准输入输出库 #include <cstring> // C语言风格字符串处理函数,如 strcpy, strlen 等 #include "mystring.h" // 用户自定义的头文件 ``` --- ### 三、为什么你的代码 `#include ` 是错误的? ```cpp #include #include ``` 这两行代码 **没有指定任何头文件**,所以编译器不知道你要包含什么内容,会报错: ``` error: #include expects "filename" or <header> ``` --- ### 四、常见标准头文件及其作用 | 头文件 | 用途说明 | |---------------|----------| | `<iostream>` | 提供输入输出流对象,如 `std::cin`、`std::cout` | | `<cstring>` | 提供 C语言风格字符串操作函数,如 `strcpy`, `strlen` | | `<string>` | 提供 C++ 标准字符串类 `std::string` | | `<vector>` | 提供动态数组容器 `std::vector` | | `<algorithm>` | 提供常用算法,如 `std::sort`, `std::find` | --- ### 五、正确的 `#include` 示例 ```cpp #include <iostream> // 必须的,用于 cout 和 cin #include <cstring> // 必须的,用于 strcpy 和 strlen ``` 如果你使用的是 `std::string`,还需要: ```cpp #include <string> ``` --- ### 六、在你的 `mystring` 类中为什么要包含这两个头文件? - `#include <iostream>`:为了重载 `<<` 和 `>>` 运算符,使用 `std::ostream` 和 `std::istream`。 - `#include <cstring>`:为了使用 `strcpy`、`strlen`、`strcmp`、`strcat` 等函数操作 C语言风格字符串。 --- ### 七、正确写法回顾 ```cpp #include <iostream> // 输入输出流 #include <cstring> // C语言字符串函数 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值