为什么Leopard会使用$ non_lazy_ptr来破坏一些符号?更重要的是,修复未定义的符号错误的最佳方法是什么,因为符号已经被$ non_lazy_ptr修改了?
要解决Visual Studio生成的错位C++名称,您可以使用undname.exe.
但是,如果你想避免每次需要去封装时创建一个完整的流程的开销呢?
Visual Studio SDK中是否有任何等效功能(VS2005中应该支持)?
我试图使用Reg Gate的Reflector从程序集中恢复源代码.原始资源利用了几个C#3.0功能,这使得恢复有点困难.例如,这里是匿名类型的恢复源.弹出的第一件事是类标识符中的<> in.运行时类型命名规则显然比设计时规则更自由.很公平.简单的搜索和替换将解决这个问题.我必须注意哪些其他编译器修改以及如何处理它们?
[DebuggerDisplay(@"\{ OverrideType = {OverrideType}, EntityType = {EntityType} }", Type="<Anonymous Type>"), CompilerGenerated]
internal sealed class <>f__AnonymousType1<<OverrideType>j__TPar, <EntityType>j__TPar>
{
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
private readonly <EntityType>j__TPar <EntityType>i__Field;
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
private readonly <OverrideType>j__TPar <OverrideType>i__Field;
[DebuggerHidden]
public <>f__AnonymousType1(<OverrideType>j__TPar OverrideType, <EntityType>j__TPar EntityType)
{
this.<OverrideType>i__Field = OverrideType;
this.<EntityType>i__Field = EntityType;
}
[DebuggerHidden]
public override bool Equals(object value)
{
var type = value as <>f__AnonymousType1<<OverrideType>j__TPar, <EntityType>j__TPar>;
return (((type != null) && EqualityComparer<> <<OverrideType>j__TPar>.Default.Equals(this.<OverrideType>i__Field, type.<OverrideType>i__Field)) && EqualityComparer<<EntityType>j__TPar>.Default.Equals(this.<EntityType>i__Field, type.<EntityType>i__Field));
}
[DebuggerHidden]
public override int GetHashCode()
{
int num = -338316509; …Run Code Online (Sandbox Code Playgroud) 当你有这样的ASP控件:
<asp:TreeView ID="TreeItems" runat="server"></asp:TreeView>
Run Code Online (Sandbox Code Playgroud)
它生成的html会破坏名称.如果我想直接访问生成项的ID,我可以尝试找出它破坏名称的内容并查找该ID.
生成的项目的名称是否保证以Microsoft的任何标准以特定方式完成?如果他们发布了以不同方式执行此操作的新版.NET,我只是害怕这种情况.有没有办法在代码中生成自己的名称?
我有一个D DLL,由我无法控制的C++程序加载.程序LoadLibrarys我的DLL并使用GetProcAddress查找名为"extension_load"的函数,该函数接受一个参数(一个指针).在我的D DLL中,我有:
extern (C) int extension_load(void* ptr) {
return 0;
}
Run Code Online (Sandbox Code Playgroud)
此名称需要导出为extension_load,但它将作为extension_load @ 4导出,因此GetProcAddress无法找到它.如何在没有名称修改的情况下将其设为plain extension_load?
我们可以在python中模拟私有和受保护的访问说明符吗?
名字莽莽
例如:
__var=10
Run Code Online (Sandbox Code Playgroud)
可以模拟私有,但它可以通过对象轻松访问外部.
object._className__var
Run Code Online (Sandbox Code Playgroud)
那么有没有一种方法我们可以直接模拟或做python一个我不知道的解决方案?
在我的C++ applicatoin我有功能的虚拟地址,我希望得到他们的错位的名字.现在我只能通过使用winapi SymFromAddr函数获得未编号的名称.有没有办法获得受损的名字呢?
我正在尝试实现一个外部c ++头接口,它将作为共享库生成.它们的示例接口具有包含在extern"C"中的c样式功能,因为它们不希望执行名称修改.
我当前的实现依赖于qt.我现在可以将这个qt代码放在extern"C"中并期望它开箱即用吗?如果这有效的原因?
伪代码://不要指望它可以工作并且可能包含错误.
extern "C"{
void doStuff(){
QString filename="Data.txt";
QFile file( filename );
if ( file.open(QIODevice::ReadWrite) )
{
QTextStream stream( &file );
std::stringstream ss;
ss<<"something"<< endl;
}
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢!
C++编译器经常破坏函数名称以支持许多功能.Programer可以使用extern"C"方式抑制默认名称修改.但是,为什么int main(int, char **)不受影响呢?
// test.cpp
int max(int a, int b) {
return a > b ? a : b;
}
extern "C" {
int min(int a, int b) {
return a < b ? a : b;
}
}
int main (int argc, char *argv[]) {
return 0;
}
Run Code Online (Sandbox Code Playgroud)
和
$ xcrun --sdk macosx clang -x c++ -c test.cpp -o test
$ xcrun nm -nm test
0000000000000000 (__TEXT,__text) external __Z3maxii
0000000000000030 (__TEXT,__text) external _min
0000000000000060 …Run Code Online (Sandbox Code Playgroud) 请考虑以下C++程序:
int _Z5func2v;
void func2() {
}
Run Code Online (Sandbox Code Playgroud)
当您尝试编译它时,它会失败:
$ g++ test.cpp -c
/tmp/cc1RDxpU.s: Assembler messages:
/tmp/cc1RDxpU.s:13: Error: symbol `_Z5func2v' is already defined
/tmp/cc1RDxpU.s: Error: .size expression for _Z5func2v does not evaluate to a constant
Run Code Online (Sandbox Code Playgroud)
这是因为程序定义了一个全局变量,该变量与名称重整后的函数名称相同.
我可以想到很多方法可以解决这个问题,其中最简单的方法是在错位名称的开头使用两个下划线(两个下划线保留用于私有实现).
问题是:为什么选择的方案可以实现?