前两天看到的#pragma用法

作者在使用BCB进行Winsdk编程时,遇到资源文件无法与程序源代码链接的问题,后通过google找到用#pragma编译指令控制的方法。文中介绍了#pragma在C++ Builder和VC++中的多种用法,如控制警告信息、指定编译优先级等,还提醒要注意其与头文件的位置关系。

前两天使用BCB进行Winsdk的编程中,死活无法加载资源文件(*.res),写出的RC文件没有问题,用Brcc32也可以生成资源文件,但是就是无法和程序源代码进行链接起来(如果用IDE就好办多了,但无奈现在用的是命令行编译),百思不得其解,到晚上发帖无数,结果还是没有搞定。

后来无奈用google,发现好似可以用#pragma编译指令来控制,在优快云的一些文章中找到了答案,也发现了一些相关的其他技巧,写下来要记牢。

#pragma 的用法


这是一个编译控制指令,可以在编译时动态地调整编译选项,这种指令在不同的编译系统中是不同的。


    #pragma warning(disable 4068)的意思是不显示4068号警告信息,如果编译时总是出现4068号警告,而认为肯定不会有错误,可以使用这条指令。这条指令C++ Builder和VC++都支持。
    如果你没有在函数内部使用某个参数,编译时会报告"Parameter name is never used in function func-name",使用#pragma argsused,编译时就不再警告了。VC++不支持这条指令。
    在C++ Builder和VC++的帮助中所有#pragma的详细说明。


    #pragma hdrstop表示预编译头文件到此为止,后面的头文件不进行预编译。BCB可以预编译头文件以加快链接的速度,但如果所有头文件都进行预编译又可能占太多磁盘空间,所以使用这个选项排除一些头文件。
    有时单元之间有依赖关系,比如单元A依赖单元B,所以单元B要先于单元A编译。你可以用#pragma startup指定编译优先级,如果使用了#pragma package(smart_init) ,BCB就会根据优先级的大小先后编译。
    #pragma resource "*.dfm"表示把*.dfm文件中的资源加入工程。*.dfm中包括窗体外观的定义。

在使用#pragma的时候要注意和头文件的相互位置,在C++Builder中,焦点放在#pragma字段上,按F1可以获得更多更详细的用法介绍说明。

按照下面提供的通达信dll标准制作方法,制作所有股票自2012年以来所有股票日涨幅的中位数,大体思路如下,通过直接读取VIPOC中的二进制数据DAT获取所有股票收盘价,计算日涨幅中位数赋值给pfout数组,#ifndef __PLUGIN_TCALC_FUNC #define __PLUGIN_TCALC_FUNC #pragma pack(push,1) //函数(数据个数,输出,输入a,输入b,输入c) typedef void(*pPluginFUNC)(int,float*,float*,float*,float*); typedef struct tagPluginTCalcFuncInfo { unsigned short nFuncMark;//函数编号 pPluginFUNC pCallFunc;//函数地址 }PluginTCalcFuncInfo; typedef BOOL(*pRegisterPluginFUNC)(PluginTCalcFuncInfo**); #pragma pack(pop) #endif 上面代码是dll函数头文件,#include "stdafx.h" #include "TCalcFuncSets.h" //生成的dll及相关依赖dll请拷贝到通达信安装目录的T0002/dlls/下面,再在公式管理器进行绑定 void TestPlugin1(int DataLen,float* pfOUT,float* pfINa,float* pfINb,float* pfINc) { for(int i=0;i<DataLen;i++) pfOUT[i]=i; } void TestPlugin2(int DataLen,float* pfOUT,float* pfINa,float* pfINb,float* pfINc) { for(int i=0;i<DataLen;i++) { pfOUT[i]=pfINa[i]+pfINb[i]+pfINc[i]; pfOUT[i]=pfOUT[i]/3; } } //加载的函数 PluginTCalcFuncInfo g_CalcFuncSets[] = { {1,(pPluginFUNC)&TestPlugin1}, {2,(pPluginFUNC)&TestPlugin2}, {0,NULL}, }; //导出给TCalc的注册函数 BOOL RegisterTdxFunc(PluginTCalcFuncInfo** pFun) { if(*pFun==NULL) { (*pFun)=g_CalcFuncSets; return TRUE; } return FALSE; }这是dll函数中的CPP代码
07-26
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值