相关疑难解决方法(0)

C++ 11 - typeid唯一性

在C++ 11中,我正在使用它

typeid(T).name()
Run Code Online (Sandbox Code Playgroud)

对于我自己的哈希计算.我不需要在程序运行或编译之间使结果相同.我只需要它对于类型是唯一的.我知道,它可以为不同类型的返回相同的名称,但它通常是常量,指针等.在我的情况下,T仅仅是class XY,struct XX或派生类型.

在这种情况下,我可以假设,这T将是独一无二的吗?

c++ typeid c++11

27
推荐指数
3
解决办法
3703
查看次数

从二进制dll文件中删除C++类名

我在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在评论中给出了答案.感谢他并且对别人感到羞耻.

c++ dll obfuscation linker visual-studio-2010

7
推荐指数
1
解决办法
2465
查看次数

剥去膨胀可执行文件(GCC)的未使用的运行时函数

我为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::exceptionstd::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++ embedded gcc cross-compiling

7
推荐指数
1
解决办法
2835
查看次数

在异常处理期间键入分辨率

当抛出异常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类型化的对象.

我不明白的是,这怎么可以静态解决?还是动态解决?是否传播了类型信息?

c++ exception-handling exception

6
推荐指数
1
解决办法
143
查看次数

从typename获取type_info

有没有办法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是什么?

c++ types typeinfo c++11

2
推荐指数
1
解决办法
392
查看次数