__decspec(selectany)

我们在使用宏定义一类的技术时,容易发生符号的重定义,特别在这个符号是全局变量时。

可以使用__decspec(selectany)提示编译器,可以重定义此符号。

1.cpp

int sym = 1;

int main()

{

...

}

2.cpp

int sym = 1;

void function()

{...}//only used to prompt the sym is global symbol

编译器会提示,符号重定义。



我们两种解决方案:

1.cpp

int sym = 1;

int main()

{

...

}

2.cpp

extern int sym;

void function()

{...}//only used to prompt the sym is global symbol

第一个方法就是不要重定义咯~



1.cpp

extern __declspec(selectany)  int sym = 1;

int main()

{

...

}

2.cpp

extern __declspec(selectany) int sym = 1;

void function()

{...}//only used to prompt the sym is global symbol

这个时候编译器会任选一个sym的定义作为sym的定义语句。

所以,我们通常这么也这么定义:

extern const __declspec(selectany) int sym = 1;

以上

时间: 2024-10-14 00:24:31

__decspec(selectany)的相关文章

浅谈__declspec(selectany)该何时用

__declspec是一个Microsoft Visual C++特定的编译器属性开关.括号中指 明的是哪一个属性生效.关于__declspec的其他属性可以百度"__declspec msdn" 查看微软的官方帮助.也可以参看博客中转载的文章. 言归正传.__declspec(selectany)在MSDN中的说明是这样的: Tells the compiler that the declared global data item (variable or object) is a

C++   类工厂实现动态对象创建

看了MFC中的动态创建对象后,感觉动态创建对象算是一种技术吧,理论上说算是一种设计模式.其实创建的原理很明了,把对象的类别名称和其构造函数用容器记录下来,在需要的时候给出创建类别查找容器即可创建对象.当然这里我们需要自定义一个全局的函数指针用来指向类别的构造函数.在这里我们使用类工厂模式,在泪工厂中我们定义一个通用构造函数,将函数指针指向它.下面是参考一位网友思路来整理和摸索的代码: //通用的函数指针 typedef  void *(*CREATE_FUNC)(); //创建类的工厂类 cla

C++ Primer 学习笔记_34_面向对象编程(5)--虚函数与多态(二):纯虚函数、抽象类、虚析构函数、动态创建对象

C++ Primer 学习笔记_34_面向对象编程(5)--虚函数与多态(二):纯虚函数.抽象类.虚析构函数.动态创建对象 一.纯虚函数 1.虚函数是实现多态性的前提 需要在基类中定义共同的接口 接口要定义为虚函数 2.如果基类的接口没办法实现怎么办? 如形状类Shape 解决方法 将这些接口定义为纯虚函数 3.在基类中不能给出有意义的虚函数定义,这时可以把它声明成纯虚函数,把它的定义留给派生类来做 4.定义纯虚函数: class <类名> { virtual <类型> <函

c++中__declspec用法总结

“__declspec”是Microsoft c++中专用的关键字,它配合着一些属性可以对标准C++进行扩充.这些属性有:align.allocate.deprecated. dllexport.dllimport. naked.noinline.noreturn.nothrow.novtable.selectany.thread.property和uuid. 1,_declspec(1)用法一定义接口 #include <IOSTREAM>using namespace std;#defin

C++关键字(保留字)

C++ 关键字       __abstract 2 __alignof 运算符 __asm __assume __based __box 2 __cdecl __declspec __delegate 2 __event __except __fastcall __finally __forceinline __gc 2 __hook 3 __identifier __if_exists __if_not_exists __inline __int16 __int32 __int64 __in

C++字符串类

好久没有写过程序,最近想学习下界面库的开发,基于directui的界面个人觉得还不错,像金山的源代码和duilib都是不错的.本人想结合二者做一个轻量级的界面库,同时又不依赖于常用的MFC.WTL等.在程序开发中字符串的使用是必须的,C++语音没有原生字符串,STL等标准库又多是模板类,如果开发DLL导出时就出现问题了.今天从WTL库里摘出来一个简单的字符串类,实现了基本功能,可在此基础上进行扩展. 头文件 1 struct CStringDataE 2 { 3 long nRefs; 4 in

转:宏定义的极致发挥---让你的普通C++类轻松支持IDispatch自动化接口(二)

Posted on 2011-01-13 20:44 一桶浆糊 这是上一篇博客<宏定义的极致发挥---让你的普通C++类轻松支持IDispatch自动化接口>所展示的示例代码的改进版,改进之处有: 1.如果不想直接提供成员作为属性,可以用成员函数的方式提供属性读写. 2.支持基类映射表,即如果基类也实现了映射表,派生类不用重复填表,自动合并基类表项.唯一的要求就是DISPID不要重复. 3.可以同时合并多个基类映射表. 4.添加可选参数支持,比如某个方法有5个参数,后3个为可选参数(有默认值)

c++ 中__declspec 的用法

语法说明: __declspec ( extended-decl-modifier-seq ) 扩展修饰符: 1:align(#) 用__declspec(align(#))精确控制用户自定数据的对齐方式 ,#是对齐值. e.g __declspec(align(32)) struct Str1{int a, b, c, d, e;}; [转]它与#pragma pack()是一对兄弟,前者规定了对齐的最小值,后者规定了对齐的最大值.同时出现时,前者优先级高. __declspec(align(

c++ __declspec关键字详细用法

__declspec用于指定所给定类型的实例的与Microsoft相关的存储方式.其它的有关存储方式的修饰符如static与extern等是C和C++语言的ANSI规范,而__declspec是一种扩展属性的定义.扩展属性语法简化并标准化了C和C++语言关于Microsoft的扩展. 用法:__declspec ( extended-decl-modifier ) extended-decl-modifier参数如下,可同时出现,中间有空格隔开: align (C++) allocate app