Microsoft Macro

全面理解-编译器指令#pragma 用于向编译器传递特定的控制信息或指示。是编译器扩展,不同平台的编译器可能支持不同的指令。:在 Visual Studio 中定义可折叠的代码区域。的行为和语法在不同编译器中可能有所不同。不是 C++ 标准的一部分,属于编译器扩展。:头文件保护、内存对齐、警告控制、并行化等。:确保头文件只被包含一次,避免重复包含。不是标准语法,部分编译器可能不支持。:不同编译器支持不同,需谨慎使用。:向编译器传递特定的指令或提示。:控制结构体的内存对齐方式。:GCC 编译器的扩展功能。:控制编译器的警告信息。 阅读详情

#pragma预处理命令

#pragma可以说是C++中最复杂的预处理指令了,下面是最常用的几个#pragma指令:

#pragma comment(lib,"XXX.lib")

表示链接XXX.lib这个库,和在工程设置里写上XXX.lib的效果一样。

#pragma comment(linker,"/ENTRY:main_function")

表示指定链接器选项/ENTRY:main_function

#pragma once

表示这个文件只被包含一次

#pragma warning(disable:4705)

表示屏蔽警告4705

 

      C和C++程序的每次执行都支持其所在的主机或操作系统所具有的一些独特的特点。例如,有些程序需要精确控制数据存放的内存区域或控制某个函

数接收的参数。#pragma为编译器提供了一种在不同机器和操作系统上编译以保持C和C++完全兼容的方法。#pragma是由机器和相关的操作系统定义

的,通常对每个编译器来说是不同的。

        如果编译器遇到不认识的pragma指令,将给出警告信息,然后继续编译。Microsoft C and C++ 的编译器可识别以下指令:alloc_text,

auto_inline,bss_seg,check_stack,code_seg,comment,component,conform,const_seg,data_seg,deprecated,

fenv_access,float_control,fp_contract,function,hdrstop,include_alias,init_seg,inline_depth,inline_recursion,intrinsic,

make_public,managed,message,omp,once,optimize,pack,pointers_to_members,pop_macro,push_macro,region,

endregion,runtime_checks,section,setlocale,strict_gs_check,unmanaged,vtordisp,warning。其中conform,init_seg,

pointers_to_members,vtordisp仅被C++编译器支持。

 

       以下是常用的pragma指令的详细解释。

1.#pragma once。保证所在文件只会被包含一次,它是基于磁盘文件的,而#ifndef则是基于宏的。

 

2.#pragma warning。允许有选择性的修改编译器的警告消息的行为。有如下用法:

#pragma warning(disable:4507 34; once:4385; error:164) 等价于:   

#pragma warning(disable:4507 34) // 不显示4507和34号警告信息   

#pragma warning(once:4385)       // 4385号警告信息仅报告一次   

#pragma warning(error:164)       // 把164号警告信息作为一个错误

#pragma warning(default:176)     // 重置编译器的176号警告行为到默认状态 

同时这个pragma warning也支持如下格式,其中n代表一个警告等级(1---4):             

#pragma warning(push)   // 保存所有警告信息的现有的警告状态  

#pragma warning(push,n) // 保存所有警告信息的现有的警告状态,并设置全局报警级别为n   

#pragma warning(pop)    //

例如: 

#pragma warning(push)   

#pragma warning(disable:4705)

#pragma warning(disable:4706)

#pragma warning(disable:4707)

#pragma warning(pop)          

在这段代码后,恢复所有的警告信息(包括4705,4706和4707)。

3.#pragma hdrstop。表示预编译头文件到此为止,后面的头文件不进行预编译。BCB可以预编译头文件以 加快链接的速度,但如果所有头文件都进

行预编译又可能占太多磁盘空间,所以使用这个选项排除一些头文 件。

 

4.#pragma message。在标准输出设备中输出指定文本信息而不结束程序运行。用法如下:

#pragma message("消息文本")。当编译器遇到这条指令时就在编译输出窗口中将“消息文本”打印出来。

 

5.#pragma data_seg。一般用于DLL中,它能够设置程序中的初始化变量在obj文件中所在的数据段。如果未指定参数,初始化变量将放置在默认数

据段.data中,有如下用法:

  1: #pragma data_seg("Shared")   // 定义了数据段"Shared",其中有两个变量a和b
  2: int a = 0;                   // 存储在数据段"Shared"中
  3: int b;                       // 存储在数据段".bss"中,因为没有初始化
  4: #pragma data_seg()           // 表示数据段"Shared"结束,该行代码为可选的

对变量进行专门的初始化是很重要的,否则编译器将把它们放在普通的未初始化数据段中而不是放在shared中。如上述的变量b其实是放在了未初始化数

据段.bss中。

  1: #pragma data_seg("Shared")
  2: int j = 0;                      // 存储在数据段"Shared"中
  3: #pragma data_seg(push, stack1, "Shared2") //定义数据段Shared2,并将该记录赋予别名stack1,然后放入内部编译器栈中
  4: int l = 0;                      // 存储在数据段"Shared2"中
  5: #pragma data_seg(pop, stack1)   // 从内部编译器栈中弹出记录,直到弹出stack1,如果没有stack1,则不做任何操作
  6: int m = 0;                      // 存储在数据段"Shared"中,如果没有上述pop段,则该变量将储在数据段"Shared2"中

 

6.#pragma code_seg。它能够设置程序中的函数在obj文件中所在的代码段。如果未指定参数,函数将放置在默认代码段.text中,有如下用法:

  1: void func1() {                  // 默认存储在代码段.text中
  2: }
  3: 
  4: #pragma code_seg(".my_data1")
  5: 
  6: void func2() {                  // 存储在代码段.my_data1中
  7: }
  8: 
  9: #pragma code_seg(push, r1, ".my_data2")
 10: 
 11: void func3() {                  // 存储在代码段.my_data2中
 12: }
 13: 
 14: #pragma code_seg(pop, r1)
 15: 
 16: void func4() {                  // 存储在代码段.my_data1中
 17: }

7.#pragma pack。用来改变编译器的字节对齐方式。常规用法为:

#pragma pack(n)   //将编译器的字节对齐方式设为n,n的取值一般为1、2、4、8、16,一般默认为8

#pragma pack(show) //以警告信息的方式将当前的字节对齐方式输出

#pragma pack(push) //将当前的字节对齐方式放入到内部编译器栈中

#pragma pack(push,4) //将字节对齐方式4放入到内部编译器栈中,并将当前的内存对齐方式设置为4

#pragma pack(pop) //将内部编译器栈顶的记录弹出,并将其作为当前的内存对齐方式

#pragma pack(pop,4) //将内部编译器栈顶的记录弹出,并将4作为当前的内存对齐方式

#pragma pack(pop,r1) //r1为自定义的标识符,将内部编译器中的记录弹出,直到弹出r1,并将r1的值作为当前的内存对齐方式;如果r1不存在,当

不做任何操作

一个例子:

以如下结构为例: struct {
                   char a;
                   WORD b;
                   DWORD c;
                   char d;
                  }
在Windows默认结构大小: sizeof(struct) = 4+4+4+4=16;
与#pragma pack(4)一样
若设为 #pragma pack(1), 则结构大小: sizeof(struct) = 1+2+4+1=8;
若设为 #pragma pack(2), 则结构大小: sizeof(struct) = 2+2+4+2=10;
在#pragma pack(1)时:空间是节省了,但访问速度降低了;
有什么用处???
在系统通讯中,如和硬件设备通信,和其他的操作系统进行通信时等,必须保证双方的一致性。

 

8.#pragma comment。将一个注释记录放置到对象文件或可执行文件中。

其格式为:#pragma comment( comment-type [,"commentstring"] )。其中,comment-type是一个预定义的标识符,指定注释的类型,应该是compiler,exestr,lib,linker,user之一。

compiler:放置编译器的版本或者名字到一个对象文件,该选项是被linker忽略的。

exestr:在以后的版本将被取消。

lib:放置一个库搜索记录到对象文件中,这个类型应该与commentstring(指定Linker要搜索的lib的名称和路径)所指定的库类型一致。在对象文件中,库的名字跟在默认搜索记录后面;linker搜索这个这个库就像你在命令行输入这个命令一样。你可以在一个源文件中设置多个库搜索记录,它们在obj

文件中出现的顺序与在源文件中出现的顺序一样。

如果默认库和附加库的次序是需要区别的,使用/Zl编译开关可防止默认库放到object模块中。

linker:指定一个连接选项,这样就不用在命令行输入或者在开发环境中设置了。只有下面的linker选项能被传给Linker:

  1. /DEFAULTLIB
  2. /EXPORT
  3. /INCLUDE
  4. /MANIFESTDEPENDENCY
  5. /MERGE
  6. /SECTION

(1)/DEFAULTLIB:library

/DEFAULTLIB选项将一个library添加到LINK在解析引用时搜索的库列表。用/DEFAULTLIB指定的库在命令行上指定的库之后和obj文件中指定的默认

库之前被搜索。

忽略所有默认库(/NODEFAULTLIB)选项重写/DEFAULTLIB:library。如果在两者中指定了相同的library名称,忽略库(/NODEFAULTLIB:library)选项

将重写/DEFAULTLIB:library。

 

(2)/EXPORT:entryname[,@ordinal[,NONAME]][,DATA]

使用该选项,可以从程序导出函数以便其他程序可以调用该函数,也可以导出数据。通常在DLL中定义导出。

entryname是调用程序要使用的函数或数据项的名称。ordinal为导出表的索引,取值范围在1至65535;如果没有指定ordinal,则LINK将分配一个。

NONAME关键字只将函数导出为序号,没有entryname。DATA 关键字指定导出项为数据项。客户程序中的数据项必须用extern __declspec

(dllimport)来声明。

有三种导出定义的方法,按照建议的使用顺序依次为:

  1. 源代码中的__declspec(dllexport)
  2. .def文件中的EXPORTS语句
  3. LINK命令中的/EXPORT规范

所有这三种方法可以用在同一个程序中。LINK在生成包含导出的程序时还要创建导入库,除非在生成过程中使用了.exp 文件。

LINK使用标识符的修饰形式。编译器在创建obj文件时修饰标识符。如果entryname以其未修饰的形式指定给链接器(与其在源代码中一样),则LINK

将试图匹配该名称。如果无法找到唯一的匹配名称,则LINK发出错误信息。当需要将标识符指定给链接器时,请使用Dumpbin工具获取该标识符的修饰

名形式。

 

(3)/INCLUDE:symbol

/INCLUDE选项通知链接器将指定的符号添加到符号表。若要指定多个符号,请在符号名称之间键入逗号(,)、分号(;)或空格。在命令行上,对每个符号需指定一次/INCLUDE:symbol。

链接器通过将包含符号定义的对象添加到程序来解析symbol。该功能对于添加不会链接到程序的库对象非常有用。

用该选项所指定的符号将覆盖通过/OPT:REF对该符号进行的移除操作。

 

(4)/MANIFESTDEPENDENCY:manifest_dependency

/MANIFESTDEPENDENCY允许你指定位于manifest文件的<dependency>段的属性。/MANIFESTDEPENDENCY信息可以通过下面两种方式传递给LINK:

直接在命令行运行/MANIFESTDEPENDENCY

通过#pragma comment

 

(5)/MERGE:from=to

/MERGE选项将第一个段(from)与第二个段(to)进行联合,并将联合后的段命名为to的名称。

如果第二个段不存在,LINK将段(from)重命名为to的名称。

/MERGE选项对于创建VxDs和重写编译器生成的段名非常有用。

 

(6)/SECTION:name,[[!]{DEKPRSW}][,ALIGN=#]

/SECTION选项用来改变段的属性,当指定段所在的obj文件编译的时候重写段的属性集。

可移植的可执行文件(PE)中的段(section)与新可执行文件(NE)中的节区(segment)或资源大致相同。

段(section)中包含代码或数据。与节区(segment)不同的是,段(section)是没有大小限制的连续内存块。有些段中的代码或数据是你的程序直接定义和

使用的,而有些数据段是链接器和库管理器(lib.exe)创建的,并且包含了对操作系统来说很重要的信息。

/SECTION选项中的name是大小写敏感的。

不要使用以下名称,因为它们与标准名称会冲突,例如,.sdata是RISC平台使用的。

.arch

.bss

.data

.edata

.idata

.pdata

.rdata

.reloc

.rsrc

.sbss

.sdata

.srdata

.text

.xdata

为段指定一个或多个属性。属性不是大小写敏感的。对于一个段,你必须将希望它具有的属性都进行指定;如果某个属性未指定,则认为是不具备这个属

性。如果你未指定R,W或E,则已存在的读,写或可执行状态将不发生改变。

要对某个属性取否定意义,只需要在属性前加感叹号(!)。

E:可执行的

R:可读取的

W:可写的

S:对于载入该段的镜像的所有进程是共享的

D:可废弃的

K:不可缓存的

P:不可分页的

注意K和P是表示否定含义的。

PE文件中的段如果没有E,R或W属性集,则该段是无效的。

ALIGN=#选项让你为一个具体的段指定对齐值。

user:放置一个常规注释到一个对象文件中,该选项是被linker忽略的。

 

9.#pragma section。创建一个段。

其格式为:#pragma section( "section-name" [, attributes] )

section-name是必选项,用于指定段的名字。该名字不能与标准段的名字想冲突。可用/SECTION查看标准段的名称列表。

attributes是可选项,用于指定段的属性。可用属性如下,多个属性间用逗号(,)隔开:

read:可读取的

write:可写的

execute:可执行的

shared:对于载入该段的镜像的所有进程是共享的

nopage:不可分页的,主要用于Win32的设备驱动程序中

nocache:不可缓存的,主要用于Win32的设备驱动程序中

discard:可废弃的,主要用于Win32的设备驱动程序中

remove:非内存常驻的,仅用于虚拟设备驱动(VxD)中

如果未指定属性,默认属性为read和write。

在创建了段之后,还要使用__declspec(allocate)将代码或数据放入段中。

例如:

//pragma_section.cpp

#pragma section("mysec",read,write)

int j = 0;

__declspec(allocate("mysec"))

int i = 0;

int main(){}

该例中, 创建了段"mysec",设置了read,write属性。但是j没有放入到该段中,而是放入了默认的数据段中,因为它没有使用__declspec(allocate)进

行声明;而i放入了该段中,因为使用__declspec(allocate)进行了声明。

 

10.#pragma push_macro与#pragma pop_macro。前者将指定的宏压入栈中,相当于暂时存储,以备以后使用;后者将栈顶的宏出栈,弹出的宏将覆盖当前名称相同的宏。例如:

  1: #include <stdio.h>
  2: #define X 1
  3: #define Y 2
  4: 
  5: int main() {
  6: printf("%d",X);
  7:    printf("\n%d",Y);
  8:    #define Y 3   // C4005
  9:    #pragma push_macro("Y")
 10:    #pragma push_macro("X")
 11: printf("\n%d",X);
 12:    #define X 2   // C4005
 13: printf("\n%d",X);
 14:    #pragma pop_macro("X")
 15:    printf("\n%d",X);
 16:    #pragma pop_macro("Y")
 17:    printf("\n%d",Y);
 18: }

输出结果:

1

2

1

2

1

3

简单说明预处理命令“#pragma comment”用法 是用于在 Microsoft Visual C++ 编译器中链接指定库的预处理指令。 阅读详情

相关推荐

【C语言】全面系统讲解 `#pragma` 指令:从基本用法到高级应用

在 C 和 C++ 编程中,`#pragma` 是一个预处理指令,用来给编译器提供一些特殊的指示。它通常用于调整编译行为、控制特定编译器的优化、内存对齐以及防止头文件的重复包含等。不同的编译器可能支持不同的 `#pragma` 指令,且它们的语法和行为可能会有所差异。

LuckiBit 1720

#pragma用法详解

概述 我们在写代码时,总会遇到头文件多次包含的情况,刚开始时我们使用宏定义进行控制,之后发现有#pragma once这样简单的东西,当时是很兴奋,以为#pragma就这一种用法。 1、什么是预处理 预处理是将源文件的文本作为翻译的第一阶段操作的文本处理步骤。 预处理不会分析源文本,但会为了查找宏调用而将源文本细分为标记。 主要包括了下面三个方面: 预处理指令 预处理运算符 预定义宏,这个有很多了,比如__FILE__、__LINE__和__DATA__等。 其中预处理指令包括: 预处理运算符包括: 这里有

qq_40569221的博客 2万+

树莓派学习系列7——GPIO基础

前言 原来学单片机的时候,就是通过一系列的引脚来控制单片机。终于学到了通过引脚来控制树莓派了。话不多说咱们先来了解基础。

我在等那么一天的博客 1万+

#pragma预处理命令

#pragma可以说是C++中最复杂的预处理指令了,下面是最常用的几个#pragma指令: #pragma comment(lib,"XXX.lib") 表示链接XXX.lib这个库,和在工程设置里写上XXX.lib的效果一样。 #pragma comment(linker,"/ENTRY:main_function") 表示指定链接器选项/ENTRY:main_function #pragma ...

weixin_34216107的博客 1998

3DGS-to-PC实战指南:零代码实现3D高斯场景到点云/Mesh的高效转换

本文详细介绍了3DGS-to-PC工具如何实现3D高斯场景到点云/Mesh的高效转换,无需代码即可完成。通过实战案例和参数调优技巧,帮助用户快速掌握这一开源插件的使用方法,提升3D数据处理效率。特别适合建筑扫描、影视特效等领域的专业人士。

q1w3e5r7t9y的博客 273

YOLOv12改进策略【独家融合改进】| MobileNetV4+BiFPN,轻松实现降参涨点,适用专栏内所有的骨干替换

可扩展的高效物体检测BiFPN(加权双向特征金字塔网络)

Limiiiing的博客 978

VS2017没有microsoft macro assembly

右击已经建好的项目,添加项 选择c++文件,并将文件名设置为.asm后缀。 右击此文件,可见Microsoft Macro Assembly

weixin_41422571的博客 3069

【异常检测】新版异常检测库anomalib的使用

异常检测库anomalib的使用。

胡侃有料的博客 4388

Microsoft Macro Assembler 8.0 (MASM) 下载

 Microsoft Macro Assembler 8.0 (MASM) 是一个利用 x86 汇编语言程序并产生相应的二进制文件的工具。用 MASM 生成的汇编语言程序可以使用 Visual C++ 2005 Express 版进行编辑和调试。本软件包需要在计算机上先行安装 Visual C++ 2005 Express 版。微软下载连接:http://www.microsoft.com/d

parmhan的专栏 1729

64、5G 侧链通信技术详解

本文详细解析了5G侧链通信的关键技术,包括资源感知与选择、UE间协调、混合ARQ、功率控制、信道探测与CSI报告以及侧链同步。资源感知与选择通过周期性或随机方式实现资源分配,UE间协调通过主动或被动方式避免资源冲突。混合ARQ机制确保数据传输可靠性,功率控制和信道探测优化传输质量并减少干扰。侧链同步则通过多种方式确保设备间时间一致性。这些技术相互配合,构建了高效稳定的5G侧链通信体系,适用于智能交通、物联网、应急通信等多个领域,为未来无线通信发展提供强大支撑。

oil88的博客 99

ESP32-C3入门教程 环境篇③——VS Code IDE快速入门

文章目录一、安装Visual Studio Code二、安装扩展三、配置ESP-IDF 插件四、创建工程五、配置工程5.1 选择目标芯片5.2 项目配置六、编译工程七、固件分析七、固件下载八、串口日志九、单步调试 一、安装Visual Studio Code 下载并安装Visual Studio Code 二、安装扩展 左侧扩展 搜索espressif 点击安装 三、配置ESP-IDF 插件 按下F1按键 输入configure esp-idf extension EXPRESS,如果你

8301

VS2017&VS2019找不到Microsoft Macro Assembly的问题

在学习 **<汇编语言 基于X86处理器>**时搭建汇编环境的时候遇到了一些问题,记录一下,希望可以帮助到和我一样问题的人。 ## 1.创建空项目 2017 和2019创建空项目是不 ...

oNuanFeng的博客 3369

智能运营模型的建设与运用实践

一项运营活动的全流程,主要包含客群挖掘与筛选、产品与权益选择、触点与活动选择、运营策略调优等关键环节,涉及客群管理、活动管理、权益管理、触达管理、智能调控等系统支撑需求,如今工商银行已开展与其相对应的推荐模型、分析模型等的研发与实践。自2023年9月该模型被知客运营平台吸收并上线以来,已累计有远程银行中心、吉林分行、重庆分行等30余家分行或机构使用,赋能融e借、积存金、结售汇、基金、理财、存款等12种场景,产生营销客户清单达千万人次,有力促进了保守型理财、天天盈、添益快线、寿险等产品的销售。

银行信息系统应用架构详解 849

MASM(Microsoft Macro Assembler)

MASM是用于x86架构的汇编语言工具,适合开发操作系统、驱动程序和性能关键型应用。其宏支持和结构化编程特性使其在低级编程中非常强大。

weixin_51883798的博客 750

裸眼3D技术发展与应用前景

这项技术利用传感器或摄像头实时监测观众的位置和视角,然后根据观众的位置信息动态调整投射的图像,确保不同位置的观众都能看到一致的3D效果。这种技术不仅可以在电影院和家庭影院中应用,还可以用于虚拟现实设备和大型展览等领域。裸眼3D呈现是一种不需要佩戴任何特殊设备(如3D眼镜或头盔)即可观看到3D效果的技术。这种技术近年来得到了快速发展,为观众带来了更加沉浸式的视觉体验。总之,裸眼3D呈现技术的发展为观众带来了更加真实、沉浸式的视觉体验。随着技术的不断进步和创新,相信未来裸眼3D将会在更多领域得到应用和推广。

学无止境 1991

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

VS2017 找不到 microsoft macro assembly

我搞汇编配环境时候的第一个解决方案的第一个项目取名叫“hello.asm”,然后属性里死活就是没有microsoft macro assembly选项,然后我改了一个名字叫“emmm.asm”就好了… 然后如果此解决方案里一个asm文件都还没有,这个孙子也是会不出现的 小朋友我真的有很多问号???? ...

weixin_42986599的博客 1195

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

VS2019找不到Microsoft Macro Assembly的问题

先举几个乱教的反面例子 上述均为扯淡,误人。 正确: 选中就可以了

m0_52813850的博客 1704

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Microsoft Macro Assembler 8.0 (MASM) Package (x86)

http://www.microsoft.com/downloads/details.aspx?FamilyId=7A1C9DA0-0510-44A2-B042-7EF370530C64&displaylang=en

Linhanshi Blog 1808

解决Microsoft Visual Studio 2010 Macro宏无法运行

这个问题是由于系统打补丁引起的。解决方法见 http://visualstudioextensions.vlasovstudio.com/2014/02/13/visual-studio-2010-macros-stop-working-after-february-2014-windows-update/

2673

MASM介绍——摘自维基百科

 MASM维基百科,自由的百科全书跳转到: 导航, 搜索MASM 是 Microsoft Macro Assembler 的缩写,它是 微软 为 x86 微处理器家族,所写的一套宏组译器。它最初是用来发展在 MS-DOS 上面执行的软件,同时,它也该系统最流行的组译器。它支援的宏很灵巧,既广泛又多样性,结构化程式的惯用语法,包含高阶架构式的循环、程序呼叫,以及轮替 (alt

congwulong的专栏 3329

汇编用到的所有工具

Debug (command)——- debug is a command in DOS, OS/2 and Microsoft Windows (only in 32bit[1]) whic

z862529671的博客 2313

Microsoft Visual Basic for Application技术概要

 Microsoft Visual Basic for Application技术概要         众所周知,Visual Basic系列产品在Microsoft的产品线中占有非常独特的位置,从IE,到Office,乃至Visual Studio系列产品中总要配备一个基于Visual Basic的描述引擎以便进行功能扩展。Microsoft Visual Basic for Applica

.NET博文收藏 983

Excel的Macro读取XML文件到Excel

若干年前满满的热情,被懒惰消磨。。。闲话少说,昨天闲着看小说的时候,突然朋友来信询问用Excel的VBA把XML转成Excel格式表示出来的程序编译通不过。他是网上找的一个简单的例子,没想到程序虽短,坑却不少。随即东拼西凑,做了个例子大致解决问题。网上雷同的内容肯定很多,我只能保证自己的肯定能运行,同时借鉴了网上诸位大能的片段,反正现在编程不就是copy,paste嘛。说一句客观的话:每一句都是自己写的程序的可靠性很低,需要测试测试再测试。被大家传唱的才是经过千锤百炼的,那些被抛弃的都是有bug哒。 要求

jiang_yu98的专栏 683

VBA SDK技术-给你的程序增加窗体设计器,运行VB代码Microsoft Visual Basic for Application

1999年4月,Microsoft发行Visual Basic for Application 6.0 SDK,这个SDK的发布,标志着VBA集成技术走向成熟,最新的Office 2007集成了VBA 6.5。如果你打算开发带有VBA引擎的软件系统,几个围绕VBA的基本概念是必须掌握的,最重要的概念是1、VBA工程;当一个应用系统的对象模型与VBA语言彻底集成后,如上显示的VBA IDE就会充分发挥IDE的编程能力,因此,当开发定制化要求很高的大、中型软件应用时,集成VBA引擎不失为一种有竞争力的考虑。

300
上一篇: 自己写了一个c++ bitset,功能非常齐全!
下一篇: c++ 头文件<cstring>(或者string.h)中的常见函数的实现!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值