Visual C++ 别名包含的用法: #pragma include_alias

本文介绍了一种解决使用某些版本DirectXSDK编译mpc时出现的dxtrans.h文件缺失的方法。通过选择合适的DirectXSDK版本或应用特定的补丁,可以有效避免编译错误。

缘起:

 

用某些版本的DirectX SDK 来编译mpc时会遇到如下问题:

 

.....include/qedit.h(498) : fatal error C1083: Cannot open include file: 'dxtrans.h': No such file or directory

 

这是因为 dxtrans.h这个文件在某些版本的Microsoft DirectX SDK中由于某些未知原因在发布的根本就没有发布。

 

解决方法之一就是选择一个包含该文件的DirectX SDK来编译mpc。

解决方法之二是用如下补丁

 

 

--- src/apps/mplayerc/FakeFilterMapper2.cpp (revision 1164)

+++ src/apps/mplayerc/FakeFilterMapper2.cpp (working copy)

@@ -27,6 +27,11 @@

 #include "../../DSUtil/DSUtil.h"

 

 #include <initguid.h>

+#pragma include_alias( "dxtrans.h", "qedit.h" )

+#define __IDxtCompositor_INTERFACE_DEFINED__

+#define __IDxtAlphaSetter_INTERFACE_DEFINED__

+#define __IDxtJpeg_INTERFACE_DEFINED__

+#define __IDxtKey_INTERFACE_DEFINED__

 #include <qedit.h>

 

 

 

标准的include_alias使用语法为:

 

 

#pragma include_alias( "long_filename", "short_filename" )
#pragma include_alias( <long_filename>, <short_filename> )
意味着编译器在编译过程中会将严格匹配的头文件包含做如下替换
将所有 
#include "long_filename"
替换成
#include "short_filename"
同样将所有:
#include <long_filename>
替换成
#include <short_filename>
注意必须是完全匹配的情况才会被替换,因此下面的语法中的 "./mymath.h"和"sys/mymath.h"就不会被替换成math.h
#pragma include_alias("mymath.h", "math.h")
#include "./mymath.h"
#include "sys/mymath.h"
理论上可以用include_alias做如何文件名的替换,例如
#pragma include_alias( "api.h", "c:/version1.0/api.h" )
#pragma include_alias( <stdio.h>, <newstdio.h> )
#include "api.h"
#include <stdio.h>
"api.h"会被替换成"c:/version.0/api.h"
<stdio.h>会被替换成<newstdio.h>
但是如下语法则不会被替换:
#include <api.h>
#include "stdio.h"
一些例外情况参见:
http://msdn.microsoft.com/en-us/library/wbeh5h91.aspx

 

在使用 Qt Creator 时,用户可能会遇到如下警告信息: ``` warning: #pragma execution_character_set expected 'push' or 'pop' ``` 该警告通常出现在 Windows 平台下,特别是在使用 Microsoft Visual C++ 编译器时。其原因是代码中使用了 `#pragma execution_character_set("xxx")` 指令,但该指令的语法存在错误或编译器不支持该指令的特定用法。 ### 原因分析 `#pragma execution_character_set` 是 Microsoft 编译器的一个扩展指令,用于指定源文件的执行字符集。它通常用于解决中文字符等非 ASCII 字符在字符串中显示为乱码的问题。其标准用法应如下所示: ```cpp #pragma execution_character_set("utf-8") ``` 然而,如果该指令拼写错误、参数不正确或未正确使用 `push` 或 `pop` 参数,编译器将提示: ``` expected 'push' or 'pop' ``` ### 解决方法 1. **检查 `#pragma` 指令的拼写和语法** 确保指令格式正确,例如: ```cpp #pragma execution_character_set("utf-8") ``` 如果不需要设置执行字符集,建议直接删除该指令。 2. **使用编译器选项代替 `#pragma`** 更推荐的方式是通过编译器命令行参数指定字符集。例如,在 MSVC 中可以添加 `/utf-8` 参数,表示源文件和执行字符集均为 UTF-8: ``` cl /utf-8 source.cpp ``` 在 Qt Creator 中,可以通过 `.pro` 文件添加如下内容: ```qmake QMAKE_CXXFLAGS += /utf-8 ``` 3. **统一文件编码格式** 确保源文件保存为 UTF-8(无 BOM)或 UTF-8(带 BOM),并在 Qt Creator 中统一设置默认编码格式为 UTF-8。路径如下: ``` Tools → Options → Text Editor → File Encoding ``` 4. **禁用不必要字符集设置** 如果项目中不涉及非 ASCII 字符或资源文件中未使用宽字符,可移除所有 `#pragma execution_character_set` 指令以避免警告。 ### 示例代码 以下是一个使用 UTF-8 字符集的简单 Qt 示例: ```cpp #include <QApplication> #include <QLabel> int main(int argc, char *argv[]) { QApplication app(argc, argv); QLabel label("你好,世界!"); // 使用 UTF-8 编码的字符串 label.show(); return app.exec(); } ``` 若文件保存为 UTF-8 格式,并在编译器中启用 `/utf-8` 参数,则无需使用 `#pragma execution_character_set`。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值