extern

dll中使用exe中的变量

◇◆丶佛笑我妖孽 提交于 2020-03-18 18:56:37
注意:输出目录为:Result共享目录 1、exe项目: // EXE.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" extern"C"__declspec(dllexport) int num(9); extern"C"__declspec(dllexport) int Sum(); extern"C"__declspec(dllexport) int Sum() { num++; return num; }; int _tmain(int argc, _TCHAR* argv[]) { return 0; } 2、DLL.h //win32 DLL #pragma once #ifdef DLLUSEEXE_EXPORTS #define DLL_API _declspec(dllexport) #else #define DLL_API _declspec(dllimport) #endif //define DLL_API _declspec(dllexport) // 报错时可替换上面 class DLL { public: DLL(void); ~DLL(void); }; extern "C" DLL_API int GetNum(); extern "C" DLL_API int GetSum(); 3、DLL.cpp

DLL的Export和Import及extern \"C\"

南楼画角 提交于 2020-03-18 11:29:09
今天使用Unrar.dll,在调用RARProcessFileW时,VS总是提示“error LNK2001: 无法解析的外部符号”。 Unrar.dll中是使用 extern "C" 对外输出函数,测试发现,其他函数可以正常调用,只有RARProcessFileW有此错误。 最后检查发现在.def文件中没有导出这个文件。 EXPORTS RAROpenArchive RAROpenArchiveEx RARCloseArchive RARReadHeader RARReadHeaderEx RARProcessFile RARProcessFileW RARSetCallback RARSetChangeVolProc RARSetProcessDataProc RARSetPassword RARGetDllVersion DLL的export是指将DLL中的函数和数据输出到其它程式中,以供其使用。 DLL的import是指使用DLL的程式引入DLL中的函数和数据。 DLL的export DLL 中包含有一个表,称为export table(以下简称ET),其中包含了DLL中可以被外部程式使用的所有函数和数据的名字。只有记录在ET中的函数和数据才可以被外部程式所使用(如果 没有.DEF文件的话),其它所有没有记录在ET中的函数和数据都被视为是DLL私有的。因此

什么是外部链接和内部链接?

半世苍凉 提交于 2020-03-16 21:47:37
某厂面试归来,发现自己落伍了!>>> 我想了解外部链接和内部链接及其区别。 我也想知道 除非默认声明为 extern ,否则默认情况下 const 变量内部链接。 #1楼 编写实现文件( .cpp , .cxx 等)时,编译器会生成 翻译单元 。 这是实现文件中的目标文件,以及 #include 在其中的所有标头。 内部链接 仅指 翻译单元范围内的 所有内容。 外部链接 是指存在于特定翻译单元之外的事物。 换句话说, 可以通过整个程序访问 ,这是所有翻译单元(或目标文件)的组合。 #2楼 正如 dudewat所说, 外部 链接意味着在整个程序中都可以访问符号(函数或全局变量),而 内部 链接意味着只能在一个 翻译单元中对其进行 访问。 您可以使用 extern 和 static 关键字显式控制符号的链接。 如果未指定的联动是默认键是 extern 用于非 const 符号和 static (内部)为 const 的符号。 // in namespace or global scope int i; // extern by default const int ci; // static by default extern const int eci; // explicitly extern static int si; // explicitly static // the

c++重学笔记5 - 对象初始化

穿精又带淫゛_ 提交于 2020-03-16 20:12:09
喜欢这篇文章吗?喜欢的话去看博主的置顶博客,即可依据分类找到此文章的原版得到更好的体验, 图片及代码显示的问题,笔者深感抱歉,想要更好的体验去原博文即可。 title: c++重学笔记5 - 对象初始化 mathjax: true date: 2020-03-13 16:57:30 categories: [c++重学笔记] tags: [c++重学笔记] keywords: [c++重学笔记] 对象在使用以前一定要初始化    基本数据类型这里就不说了,直接讲类    类的对象的初始化往往使用了构造函数,但是很多人不会写构造函数,他们这样实现 # include <iostream> using namespace std ; class node { int x ; public : node ( ) { } node ( int x_ ) { x = x_ ; } } ; class my_class { node a , b , c , d ; public : my_class ( node a_ , node b_ , node c_ , node d_ ) { a = a_ ; b = b_ ; c = c_ ; d = d_ ; } } ; int main ( ) { } ``` < ! -- - more -- > & emsp ; & emsp ;

为什么要使用extern "C"

匆匆过客 提交于 2020-03-15 23:50:24
C/C++采用的是分别编译模型, 源代码只要声明函数, 就可调用。 编译时,在函数调用处生成一个符号引用。 链接时,将函数调用处的符号引用,替换成地址(甚至仍有可能继续保留符号, 载入时再计算地址)。 所以, 以下两者必须完全比配, 否则链接时会出错。 1. 函数调用处引用的符号名 2. 函数定义处公开的符号名 如何使得两者匹配? 无论是在调用处还是在定义处, 无论是C还是C++(注1), 编译器都会对函数名进行mangling, 产生一个符号名。 而 extern "C" 就是通知C++编译器(注2), 将某函数按照C的规则进行mangling, 产生符号名。 如果是在声明处使用 extern "C", 函数调用处引用的符号名将按C的mangling规则产生。 如果是在定义处使用 extern "C", 翻译单元里公开的符号名将按C的mangling规则产生。 同时, C编译器将 extern "C" 视为错误—— 所以需要类似 的代码 : #ifdef __cplusplus extern "C" { #endif /*...*/ #ifdef __cplusplus } #endif extern "C" 通常使用的地方。 1. 当一个函数已经由C编译器实现 在一个C++翻译单元中, 必须使用 extern "C" 声明改函数。 这样,

MoM(五)解矩阵方程

倖福魔咒の 提交于 2020-03-12 04:11:09
在阻抗矩阵填充之后,接下来就是解矩阵方程了。后期在补上公式,先上代码。 注意:方程求得解是 函数的解。 #pragma once #include<iostream> #include<stdio.h> #include<armadillo> #include<math.h> #include<complex> #include<time.h> #include<cmath> #include"FillZmat.h" using namespace arma; using namespace std; extern double k; extern mat basis_list; extern cube element_list; extern int elem_num; extern int rwg_num; extern mat Center; extern vec Area; extern mat CommonEdgeP; extern mat CommonEdgeN; extern vec EdgeLength; //公共边长度 extern vec Vertex_pos; // 正三角形的 非公共边点 编号 extern vec Vertex_naga; extern cube Center_; //九点积分划分后的小三角形重心 extern mat Pho_Pos; /

关于extern "C"(详细剖析)

本秂侑毒 提交于 2020-03-11 10:01:43
这是一篇讲得非常详细和完整的关于extern "C"的文章,值得推荐: 原文链接:https://www.cnblogs.com/TenosDoIt/p/3163621.html 【目录】 引言 extern “C”的前世今生 小心门后的未知世界 Q&A c++调用c的方法 c调用c++的方法 在你工作过的系统里,不知能否看到类似下面的代码。 这好像没有什么问题,你应该还会想:“嗯⋯是啊,我们的代码都是这样写的,从来没有因此碰到过什么麻烦啊~”。 你说的没错,如果你的头文件从来没有被任何C++程序引用过的话。 这与C++有什么关系呢? 看看__cplusplus( 注意前面是两个下划线 ) 的名字你就应该知道它与C++有很大关系。__cplusplus是一个C++规范规定的预定义宏。你可以信任的是:所有的现代C++编译器都预先定义了它;而所有C语言编译器则不会。另外,按照规范__cplusplus的值应该等于1 9 9 7 1 1 L ,然而不是所有的编译器都照此实现,比如g++编译器就将它的值定义为1。 所以,如果上述代码被C语言程序引用的话,它的内容就等价于下列代码。 在这种情况下,既然extern "C" { }经过预处理之后根本就不存在,那么它和#include指令之间的关系问题自然也就是无中生有。 extern "C"的前世今生 在C++编译器里,有一位暗黑破坏神

关于C#的WebBrowser内存占用太大的解决办法

走远了吗. 提交于 2020-03-06 08:24:05
解决方法如下: -- in class definition (在类中引用) [DllImport("KERNEL32.DLL", EntryPoint = "SetProcessWorkingSetSize", SetLastError = true, CallingConvention = CallingConvention.StdCall)] internal static extern bool SetProcessWorkingSetSize(IntPtr pProcess, int dwMinimumWorkingSetSize, int dwMaximumWorkingSetSize); [DllImport("KERNEL32.DLL", EntryPoint = "GetCurrentProcess", SetLastError = true, CallingConvention = CallingConvention.StdCall)] internal static extern IntPtr GetCurrentProcess(); -- code to call when you want to reduce the memory(在方法中执行) IntPtr pHandle = GetCurrentProcess();

C++ const限定符相关知识小结

不羁岁月 提交于 2020-03-05 22:07:05
疫情所迫,希望用这种方法督促自己坚持学习。同时记录在找工作过程中的艰辛不易。博客内容持续增减修改,都为摘录和个人理解。欢迎各位批评指正其中错误,相互勉励,共同进步。 一、const 定义和初始化 在代码中,我们希望有些变量为常值,不能为其赋值,例如为某个数据分配固定大小的内存,这时就要用到const限定符。其常见的定义和初始化方式如下: int i = 10 ; const int j = i ; //为int型常量赋给i的值 const int k = 10 ; //为int型常量赋值10 const int s ; //错误,常量类型必须有初始化值 k = 100 ; //错误,常量类型值不能修改 值得注意的是,在默认情况下,const类型仅在当前文件中有效,不能被其他文件调用。如果需要被其他文件调用,则无论在声明还是定义时都需要加入关键字 “extern”。 //在头文件中声明 extern const int size; //在其他文件调用并初始化 extern const int size = get_size ( ) ; 因此,如果想在多个文件中共享const变量,就必须加上关键字“extern” 二、const的引用 把引用绑定到const对象上,称之为对常量的引用。因此常量引用不能用来修改其绑定的const对象的值。 const int a = 10 ; /

C/C++知识点

戏子无情 提交于 2020-03-04 21:12:03
1 cout<<endl;什么意思?   就是回车的意思~ 相当于C语言里面的printf("\n"); 2 cin>> 键盘输入 例子:double r=1.0; cin>>r; //键盘输入 注意一个约定,引入标准头文件用尖括号,引入自定义头文件用双引号, 例如: 复制纯文本新窗口 #include <stdio.h> #include "myFile.h" 3 字符串结束符是“\n”,文件结束标志是EOF 4 getch()的功能   是从键盘输入一个字符,但不在屏幕上显示。在这里,该行的作用是等待,只有当用户从键盘敲任一键时,程序才继续执行。 5 C++提供一种特殊的运算符——逗号运算符。用它将两个表达式连接起来 。如   3+5, 6+8   称为逗号表达式,又称为“顺序求值运算符”。逗号表达式的一般形式为:   表达式1, 表达式2   逗号表达式的求解过程是:先求解表达式1,再求解表达式2。整个逗号表达式的值是表达式2的值。如,逗号表达式   a=3*5, a*4    赋值运算符的优先级别高于逗号运算符, 因此应先求解a=3*5(也就是把“a=3*5”作为一个表达式)。经计算和赋值后得到a的值为15,然后求解a*4,得60。             整个逗号表达式的值为60。 6 如果使用用户自己定义的函数,而该函数与调用它的函数(即主调函数)在同一个程序单位中