我经常遇到与程序可执行文件捆绑在一起的MSVCRT(或更新的等价物)的Windows程序.在典型的PC上,我会找到相同.DLL的许多副本.我的理解是MSVCRT是C运行时库,有点类似于*nix下的glibc/libc.so.
为什么Windows程序必须随身携带他们的C库,而不是仅仅共享系统范围的libc?
更新:感谢Shog9,我开始阅读有关SxS的内容,这进一步让我了解了DLL链接问题(DLL Hell) - http://blogs.msdn.com/b/martynl/archive/2005/10/ 13/480880.aspx是一个有用的介绍问题...
鉴于我作为通才的背景,我可以涵盖从模拟电子学到编写与RDBMS后端接口的简单应用程序的大部分领域.
我目前在一家开发硬件以解决行业特定问题的公司工作.我们有一位经验丰富的程序员,他们已经编写了商业应用程序,视频游戏以及其他一些用于PC的东西.但当我与他谈论做低级编程时,他同时表达了对加入该项目的兴趣和怀疑/不确定性.
即使谈论PC,他在语言层面的操作似乎比低层的东西(指令集,ISR)更舒服.尽管如此,他还是个聪明人,我认为一旦他完成了最初的学习困境,他就会很享受这项工作.但也许这是我对低级别话题的热情......如果他真的感兴趣,也许他已经开始在那个方向学习东西了?
您是否有过制作软件到硬件(或低级软件)过渡的经验?或者,更好的是,只选择一个软件,并将他转换为低级别的东西?
编辑:
PS我很想听听响应者他们自己的背景是什么 - EE,CS,两者?
关于归档PDF的这个问题让我感到疑惑 - 如果我想压缩(出于存档目的)许多文件,这些文件基本上是在主模板(信头)之上进行的小改动,看起来可以获得巨大的压缩增益文件间压缩.
是否有任何标准压缩/存档格式支持此功能?AFAIK,所有流行的格式都专注于压缩每个文件.
我知道我也不是在问这个问题.请帮我更好地形成我的问题.
我有点困难让我的思绪缠绕在手柄上 - 在某些方面,它看起来像指针.但与指针不同,似乎我可以直接将值赋给handle变量,它会影响底层数据值,而不是句柄本身.
测试代码清楚地表明,无论是否使用句柄,我都得到相同的值,或者如果我"取消引用"句柄来获取数据.显然,这不适用于非托管指针.我不明白的是什么?
#include <iostream>
int main()
{
int ^y;
int ^a, ^b, ^c;
long x;
y= gcnew int(100);
a=y;
b=y;
c=y;
c= gcnew int(200);
b= 300;
System::Console::WriteLine(y); // returns 100 (instead of something pointer-like)
System::Console::WriteLine(*y); // also returns 100
System::Console::WriteLine(a); // 100
System::Console::WriteLine(b); // 300
System::Console::WriteLine(c); // 200
x = static_cast<long>(y);
*y = 10;
System::Console::WriteLine(x); // 10
System::Console::WriteLine(y); // 10
System::Console::WriteLine(*y); // 10
}
Run Code Online (Sandbox Code Playgroud)
编辑添加 - 我怀疑WirteLine可能已经为我做了解除引用,但我原本预计静态强制转换不会.这与autounboxing有关吗?
我正在开发一个嵌入式应用程序,通过命令界面控制设备.我嘲笑VC中的指挥调度员,让我满意; 但是当我将代码移到嵌入式环境中时,我发现编译器的指针到func的实现方式已经破碎了.
这是我最初实现代码的方式(在VC中):
/* Relevant parts of header file */
typedef struct command {
const char *code;
void *set_dispatcher;
void *get_dispatcher;
const char *_description;
} command_t;
#define COMMAND_ENTRY(label,dispatcher,description) {(const char*)label, &set_##dispatcher, &get_##dispatcher, (const char*)description}
/* Dispatcher data structure in the C file */
const command_t commands[] = {
COMMAND_ENTRY("DH", Dhcp, "DHCP (0=off, 1=on)"),
COMMAND_ENTRY("IP", Ip, "IP Address (192.168.1.205)"),
COMMAND_ENTRY("SM", Subnet, "Subunet Mask (255.255.255.0)"),
COMMAND_ENTRY("DR", DefaultRoute, "Default router (192.168.1.1)"),
COMMAND_ENTRY("UN", Username, "Web username"),
COMMAND_ENTRY("PW", Password, "Web password"),
...
}
/* After …Run Code Online (Sandbox Code Playgroud) archive ×1
c ×1
c++-cli ×1
compression ×1
dispatcher ×1
embedded ×1
firmware ×1
hardware ×1
libc ×1
msvcrt ×1