当前位置:首页 » 编程软件 » 编译为本机的函数

编译为本机的函数

发布时间: 2022-05-15 23:59:39

A. C编译器编译过的函数怎样在C++中使用

本人以前的学习笔记(在网上找的):看了后,你一定可以解决

15.在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern “C”?
首先,作为extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。
通常,在模块的头文件中对本模块提供给其它模块引用的函数和全局变量以关键字extern声明。例如,如果模块B欲引用该模块A中定义的全局变量和函数时只需包含模块A的头文件即可。这样,模块B中调用模块A中的函数时,在编译阶段,模块B虽然找不到该函数,但是并不会报错;它会在连接阶段中从模块A编译生成的目标代码中找到此函数
extern "C"是连接申明(linkage declaration),被extern "C"修饰的变量和函数是按照c语言方式编译和连接的,来看看C++中对类似C的函数是怎样编译的:
作为一种面向对象的语言,C++支持函数重载,而过程式语言C则不支持。函数被C++编译后在符号库中的名字与C语言的不同。例如,假设某个函数的原型为:
void foo( int x, int y );

该函数被C编译器编译后在符号库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字(不同的编译器可能生成的名字不同,但是都采用了相同的机制,生成的新名字称为“mangled name”)。

_foo_int_int这样的名字包含了函数名、函数参数数量及类型信息,C++就是靠这种机制来实现函数重载的。例如,在C++中,函数void foo( int x, int y )与void foo( int x, float y )编译生成的符号是不相同的,后者为_foo_int_float。
同样地,C++中的变量除支持局部变量外,还支持类成员变量和全局变量。用户所编写程序的类成员变量可能与全局变量同名,我们以"."来区分。而本质上,编译器在进行编译时,与函数的处理相似,也为类中的变量取了一个独一无二的名字,这个名字与用户程序中同名的全局变量名字不同。

未加extern "C"声明时的连接方式
假设在C++中,模块A的头文件如下:
// 模块A头文件 moleA.h
#ifndef MODULE_A_H
#define MODULE_A_H
int foo( int x, int y );
#endif
在模块B中引用该函数:
// 模块B实现文件 moleB.cpp
#i nclude "moleA.h"
foo(2,3);

实际上,在连接阶段,连接器会从模块A生成的目标文件moleA.obj中寻找_foo_int_int这样的符号!

加extern "C"声明后的编译和连接方式

加extern "C"声明后,模块A的头文件变为:
// 模块A头文件 moleA.h
#ifndef MODULE_A_H
#define MODULE_A_H
extern "C" int foo( int x, int y );
#endif
在模块B的实现文件中仍然调用foo( 2,3 ),其结果是:
(1)模块A编译生成foo的目标代码时,没有对其名字进行特殊处理,采用了C语言的方式;
(2)连接器在为模块B的目标代码寻找foo(2,3)调用时,寻找的是未经修改的符号名_foo。

如果在模块A中函数声明了foo为extern "C"类型,而模块B中包含的是extern int foo( int x, int y ) ,则模块B找不到模块A中的函数;反之亦然。

所以,可以用一句话概括extern “C”这个声明的真实目的(任何语言中的任何语法特性的诞生都不是随意而为的,来源于真实世界的需求驱动。我们在思考问题时,不能只停留在这个语言是怎么做的,还要问一问它为什么要这么做,动机是什么,这样我们可以更深入地理解许多问题):实现C++与C及其它语言的混合编程
明白了C++中extern "C"的设立动机,我们下面来具体分析extern "C"通常的使用技巧:
extern "C"的惯用法

(1)在C++中引用C语言中的函数和变量,在包含C语言头文件(假设为cExample.h)时,需进行下列处理:
extern "C"
{
#i nclude "cExample.h"
}
而在C语言的头文件中,对其外部函数只能指定为extern类型,C语言中不支持extern "C"声明,在.c文件中包含了extern "C"时会出现编译语法错误。

C++引用C函数例子工程中包含的三个文件的源代码如下:
/* c语言头文件:cExample.h */
#ifndef C_EXAMPLE_H
#define C_EXAMPLE_H
extern int add(int x,int y);
#endif

/* c语言实现文件:cExample.c */
#i nclude "cExample.h"
int add( int x, int y )
{
return x + y;
}

// c++实现文件,调用add:cppFile.cpp
extern "C"
{
#i nclude "cExample.h"
}
int main(int argc, char* argv[])
{
add(2,3);
return 0;
}
如果C++调用一个C语言编写的.DLL时,当包括.DLL的头文件或声明接口函数时,应加extern "C" { }。
(2)在C中引用C++语言中的函数和变量时,C++的头文件需添加extern "C",但是在C语言中不能直接引用声明了extern "C"的该头文件,应该仅将C文件中将C++中定义的extern "C"函数声明为extern类型。
C引用C++函数例子工程中包含的三个文件的源代码如下:
//C++头文件 cppExample.h
#ifndef CPP_EXAMPLE_H
#define CPP_EXAMPLE_H
extern "C" int add( int x, int y );
#endif

//C++实现文件 cppExample.cpp
#i nclude "cppExample.h"
int add( int x, int y )
{
return x + y;
}

/* C实现文件 cFile.c
/* 这样会编译出错:#i nclude "cExample.h" */
extern int add( int x, int y );
int main( int argc, char* argv[] )
{
add( 2, 3 );
return 0;
}
15题目的解答请参考《C++中extern “C”含义深层探索》注解:

B. vb编译为“本机代码”和“P-代码”有什么不同

按照缺省规定,Visual Basic 将应用程序编译成可运行的解释型或 P-code 程序。运行时,动态链接库 (DLL) 将翻译或解释执行程序中的指令。
用“本机代码”选项来编译工程意味着您写的代码将完整地编译为处理器芯片的本地指令,而不是编译为p-code。这将大大加速循环和数学计算,并可以加速对 MSVBVM60.DLL提供的服务程序的调用。然而,这并不能减少对 DLL 的需要。

选中“编译为P-代码”,VB将应用程序编译成解释执行的P-代码程序。运行P-代码程序时,动态链接库(DLL)将翻译或解释执行程序中的指令。在许多情况下,运行本机代码比运行解释型代码本质上要快得多。

P代码似乎没什么优点喔,我唯一知道的就是编译为P代码较难破解。

Microsoft Visual Basic 6.0是一个RAD(Rapid Application Development)工具,它具有把应用程序编译成P代码或本机代码的灵活性。把应用程序编译成P代码可以使代码的长度被优化为最小。这种代码长度较 小的特点使P代码在低带宽情况下成为创建Internet应用程序的最佳选择。本机代码的编译过程对速度进行了很好的优化(将快至20倍),但是所产生的 可执行文件长度变大。Visual Basic 6.0是既支持通过P代码又支持通过本机代码快速开发应用程序的唯一RAD工具。

p代码运行可能要慢一些,但是兼容性较好、文件小,发布时建议使用P代码

这条意见 好像不对哦。

两种都应该要vb运行库的,一个要的是速度,一个要的是文件大小。

按照默认规定,Visual Basic将应用程序编译成可运行的解释型或P代码(P-Code)程序。运行时,动态链接库(DLL)将翻译或解释执行程序中的指令。在许多情况下,运行本机代码比运行解释型代码本质上要快的多。
编译为本机代码时应注意以下一些事项:
1、若代码做了大量固定类型的、非字符串变量的基本操作,则其产生的本机代码将比编译的P-Code操作码产生最大的反差。但是,对于复杂的经济计算或生成分形图形,用本机代码有很多好处。
2、计算密集型程序或在局部数据结构中处理大量的位和字节操作的程序,用本机代码就可获得明显的好处。
3、在多数的程序中,特别是那些含有大量Windows Api调用、COM方法调用和字符串操作的程序中,本机代码不比P-Code快多少。
4、含有大量子例程调用而非内嵌过程的代码,用本机代码也不是很快。

C. 为什么编译器将闭包和本地函数以不同的方式

函数闭包 种问题本身虽中国络见种提其实 Javascript 实现机制清楚胡乱猜测导致误解 首先函数管匿名函数闭包间根本没任何关系 所谓闭包究竟中国络说云雾讲高深莫测其实要稍微些编译器实现机制认识知道闭包其实非简单东西 我先看看面代码: function funcA() { var a = 依, b = 贰; return funcB(); function funcB() { // 注意a b 本函数根本没定义竟能访问 return a + b; } } var a = funcA(); // a 等于 三 面代码神奇几点: 依、函数嵌套定义( C/C++ 行) 贰、嵌套函数访问级函数局部变量 先说嵌套其实能力没神奇C/C++ 编译器稍作修改能支持实现虽函数嵌套实用价值比较访问级函数局部变量啊且我知道 Javascript 嵌套函数层层嵌套访问内层函数能够访问顶层函数变量非用 说闭包关系呢 闭包用实现种嵌套能够层层向访问变量功能简单编译器技巧用使内部函数能够访问级函数变量 简单说具体实现每函数附加额外隐藏象象其实叫做闭包象别管名字叫普通象没神奇记录本函数内部变量列表已且闭包象保存指向级函数闭包象引用 形链条我函数访问变量候编译器先看看本闭包底没变量没向寻找找用直找没提示错 明白事点按照面式构造闭包像固定其实每调用函数候都单独创建新闭包象调用应起其实闭包链态创建 其实要说清楚问题配几图间所限我细说能理解疑问慢慢接触知道 解释段代码加深理解 function X() { return function() { // ... } } 注意X面返匿名函数定要记住函数由于嵌套定义 X 闭包象链接 X 闭包象所匿名函数访问 X 内部变量其实简单管嵌套少层匿名名我看定义嵌套关系知道闭包链整链条其顺理章 推荐两让走内普遍存误区看 ECMA-贰陆贰, 5e面包含所标准化 Javascript 算实现细节另外研究 Google v吧 引擎自代码编译调试问题能搞清楚

D. 请问C中编译函数的顺序

不知道你怎么想的?
include的内容只有在程序中用到时才会被编译;
在使用main()的C程序中,没有判断和转折语句外,其它函数都是顺序执行。
现在都用C++,面向对象了。顺序指令只用于单任务系统。

E. c语言中的函数可不可以单独进行编译

是可以的。

库函数是把函数放到库里,供别人使用的一种方式。函数库是由系统建立的具有一定功能的函数的集合。库中存放函数的名称和对应的目标代码,以及连接过程中所需的重定位信息。用户也可以根据自己的需要建立自己的用户函数库。

使用C语言的语句直接计算sin或cos函数,就需要编写颇为复杂的程序。因为C语言的语句中没有提供直接计算sin或cos函数的语句。又如为了显示一段文字,我们在C语言中也找不到显示语句,只能使用库函数printf。

(5)编译为本机的函数扩展阅读

函数库的分类

1、字符串、内存和字符函数

需要的包含文件:string.h、mem.h、ctype.h或string.h;

2、数学函数

需要的包含文件:math.h;

3、动态存储分配

需要的包含文件:alloc.h或stdlib.h ;

F. excel如何编译现成函数

比如,输入=IF(A1>10,A1,"")表示:如果A1>10,就显示A1;否则留空。

G. vb应用程序除了以解释方式进行,还可以以什么方式进行

vb应用程序除了以解释方式进行,还可以编译成本机代码,在计算机的系统下直接运行。

将工程编译成本机代码

如果拥有VisualBasic的专业版或企业版,既可以将代码编译成标准的VisualBasic 伪代码格式,也可以编译成本机代码格式。本机代码编译提供了伪代码编译所没有的关于优化和调试的几个选项。

P-code或伪代码,是介于Basic 程序中的高级指令和计算机处理器执行的低级本机代码之间的一种中间步骤。在运行时刻,VisualBasic 将每一句伪代码转换成本机代码。如果将程序直接编译成本机代码,则取消了伪代码这一中间步骤。

可以使用象在VisualC++中提供的调试环境之类的标准的本机代码调试工具来调试编译后的本机代码。也可以使用例如在VisualC++ 的语言中提供的优化和调试本机代码的选项。例如,可以根据代码运行速度和大小优化代码。

注意所有用VisualBasic创建的工程都使用运行时DLL (MSVBVM60.DLL)服务。在DLL所提供的服务当中有您应用程序的启动和关闭代码、窗体和内部控件的功能,以及 Format和CLng

的运行时函数。

用“本机代码”选项来编译工程意味着您写的代码将完整地编译为处理器芯片的本地指令,而不是编译为p-code。这将大大加速循环和数学计算,并可以加速对 MSVBVM60.DLL提供的服务程序的调用。然而,这并不能减少对DLL的需要。

要将工程编译成本机代码,请按照以下步骤执行:

1.在“工程”窗口,选择希望编译的工程。

2.从“工程”菜单选择“工程属性”。

3.在“工程属性”对话框,单击“编译”选项卡。

H. VB6自带编译器的“本机代码”和“P代码”各是什么求答案

该选项卡设置工程编译时的条件。选项卡选项“编译为 P-代码”
用 p 代码来编译工程。存储在 .vbp 文件中的设置值将被覆盖掉。
“编译为本机代码”
用带有选定最优化的原码来编译工程。存储在 .vbp 文件中的设置值将被覆盖掉。
“快速代码优化”- 通过指示编译器在速度和大小之间首选速度,使 .exe 和 .dll 文件的速度最快。编译器可以减少许多功能上跟机器码序列相同的构造。在某些情况下,这种不同提供了用大小来换取速度的权衡交换。
“小代码优化”- 通过指示编译器在速度和大小之间首选大小,来使 .exe 和 .dll 文件最小。编译器可以减少许多功能上跟机器码序列相同的构造。如果不选中这个选项,代码可能就会大一些,但是速度会更快一些。
“非优化”- 无优化地编译。
“流行的 Pentium Pro™”- 优化所创建的代码,优化方向是使之更有利于 Pentium Pro™ 处理器来处理。如果在程序中使用了这个选项,则意味着仅仅是为 Pentium Pro™ 处理器所创建的代码。用此选项产生的代码仍然可以在更早期的处理器上运行,但是工作起来性能不是那么好。
“创建符号化调试信息”- 在可执行文件或者 DLL 文件中产生符号调试信息。用此选项创建的可执行文件可以用 Visual C++ 或者具有 CodeView 风格调试信息的调试器来调试。设置这个选项将为可执行文件产生一个带有符号信息的 .pdb 文件。
“高级优化”
显示“高级优化”对话框。
给程序设置一个基地址,从而覆盖 .dll 文件的缺省位置(在 0 X 10,000,000 处)。操作系统首先试图在指定的或者缺省的位置加载一个程序。如果没有足够空间,那么系统将重新定位该程序。

I. 编译程序时它说本地函数定义不合法,而这函数我是在其他函数中调用的,是什么原因呢

(1) BOOL CVEmailDlg::CapSend() -- BOOL用大写
(2) VEmailDlg.h 头文件中加入原型声明
BOOL CapSend();

J. 用C语言编写软件时 老是出现本地函数定义错误怎么办

换一个编译工具,我前几天也是,用codeblock编译经常出现这种问题,说主函数返回为int型,换了Visual C++ 6.0就不会出现这个问题,希望对你有用!

热点内容
app什么情况下找不到服务器 发布:2025-05-12 15:46:25 浏览:713
php跳过if 发布:2025-05-12 15:34:29 浏览:466
不定时算法 发布:2025-05-12 15:30:16 浏览:129
c语言延时1ms程序 发布:2025-05-12 15:01:30 浏览:163
动物园灵长类动物配置什么植物 发布:2025-05-12 14:49:59 浏览:732
wifi密码设置什么好 发布:2025-05-12 14:49:17 浏览:147
三位数乘两位数速算法 发布:2025-05-12 13:05:48 浏览:396
暴风影音缓存在哪里 发布:2025-05-12 12:42:03 浏览:539
access数据库exe 发布:2025-05-12 12:39:04 浏览:627
五开的配置是什么 发布:2025-05-12 12:36:37 浏览:363