在C++ 11中,我正在使用它
typeid(T).name()
Run Code Online (Sandbox Code Playgroud)
对于我自己的哈希计算.我不需要在程序运行或编译之间使结果相同.我只需要它对于类型是唯一的.我知道,它可以为不同类型的返回相同的名称,但它通常是常量,指针等.在我的情况下,T仅仅是class XY,struct XX或派生类型.
在这种情况下,我可以假设,这T将是独一无二的吗?
我在Visual Studio 2010下有一个C++项目,它编译成一个dll.我在我的项目中定义了几个私有的特定于实现的类,例如CMyClass.此类不是从dll或任何接口函数导出的.但是,当我检查生成的dll文件时,其中存储了一个字符串"CMyClass".它是一个发布版本,我不希望这个字符串出现在dll文件中.这个DLL被发送给客户,我希望我在项目中使用的所有名称都从dll文件中删除,所以没有人能够得到我们在dll中使用的算法这么简单的线索.
我使用Release配置.在项目属性中,链接器选项卡下的"生成调试信息"选项处于关闭状态,"C/C++"选项卡下的"调试信息格式"设置为"程序数据库(/ Zi)".我试图为"调试信息格式"设置空字符串,但没有成功.
在dll中找到的字符串看起来像.?AVCMyClass@@位于dll文件的最后.它是dll文件中唯一出现的"CMyClass"字符串.但是,几乎所有内部类都会显示此字符串.
如何摆脱这些提及?
更新
请注意,我不想混淆源代码本身.提供的链接无关紧要.我没有看到为什么类名存储在dll文件中的原因.我总是可以在构建之前重命名我的类,但这不是一个非常直接的解决方案.
UPDATE2
我不同意社区关闭这个问题,因为这不是重复.Tyler Gill在评论中给出了答案.感谢他并且对别人感到羞耻.
我为ARM(cortex-m3)构建了GCC4.7.1交叉工具链.现在,我正在链接C/C++代码中的可执行文件,肯定不会使用某些某些STL类(例如std::string).此外,例外和RTTI被关闭.
当我寻找到目标ELF(使用纳米如)虽然,有挂在我不希望找到有(如大量的符号(apparantly从的libstdc ++) std::exception,std::ios_base等等).
为什么会出现这种情况,如何摆脱这些东西以减少.text目标的截面尺寸?
一位同事给了我一个提示,以覆盖一些GCC特定的存根函数:
namespace __gnu_cxx
{
void __verbose_terminate_handler()
{
for (;;)
;
}
}
Run Code Online (Sandbox Code Playgroud)
仅此一项就将代码大小减少了大约20KB.
我可以覆盖更多这样的存根吗?
更新:
好的,我发现了一个非常愚蠢的错误,删除了我想知道的大部分内容,修复它时:在其中一个源文件中
有一条#include <iostream>语句(尽管没有任何调用).在静态课程链接的这种意志std::cin,std::cout以及std::cerr实例和所有的东西,这些走来.
删除该#include <iostream>语句会使该.text段减少大约100KB的部分.
然而:
目前仍然在std::exception和std::basic_string我想知道有关的东西:
Namespace summaries:
==============================================================================
Type Size Namespace
T 774 'std'
W 184 'std::string::_Rep'
W 268 'std'
W 472 'std::string'
Class summaries:
==============================================================================
Type Size Class
T 50 'std::error_category'
T 52 'std::type_info' …Run Code Online (Sandbox Code Playgroud) 当抛出异常C++并且堆栈被解开时,如何选择正确的处理程序(catch子句)来处理异常?
void f1()
{
throw 1;
}
void f2()
{
try
{
f1();
}
catch(const char* e)
{
std::cout << "exc1";
}
}
...
try
{
f2();
}
catch(int& e)
{
std::cout << "exc2";
}
...
Run Code Online (Sandbox Code Playgroud)
例如,这个代码不出所料地打印,"exc2"因为catch(int& e)它能够处理1 int类型化的对象.
我不明白的是,这怎么可以静态解决?还是动态解决?是否传播了类型信息?
有没有办法std::type_info从类型的名称中获取?例如,
std::type_info f(std::string name) {
std::type_info info;
...
return info;
}
int main() {
const std::string name = typeid(double).name();
std::type_info info = f(name);
assert(info==typeid(double));
}
Run Code Online (Sandbox Code Playgroud)
这个功能f是什么?