c++学习笔记三-常见基础问题

来源:互联网 发布:windows10控制面板网络 编辑:程序博客网 时间:2024/05/29 18:17

1.windows系统下标准输入的fd是多少?

coder:

       windowsconsole没有所谓的0,1,2标准输入输出fd这样的概念。windows下的进程创建时默认是没有这些输入输出的,可以在创建进程的时候手工指定也可以使用AllocConsole来创建相应的标准终端,这些终端都运行在windowDOS虚拟机中,在windows创建标准终端应该称之为标准虚拟终端,windows提供了统一的接口访问设备当然也包括虚拟设备这点上也体现了一切皆文件的思想法,使用CreateFile 并指定相应的CONIN$这样的名称来创建终端,当windows下的console程序启动的时候实际上是使用相关的API创建了这些的系统对象,至于返回的句柄是多少这和其它的文件操作返回并没有本质上的区别,然后把让进程的输入输出与这些句柄关联起来这让输入和输出就实现了。0,1,2这样的概念体现的unix上,unistd.h这个头文件中定义了STDOUT_FILENO这样的常量来表示0,1,2。至于C语言由于历史原因,其内部使用的stdout,stdin等流式文件对象句柄也这么体现,这属于上层库的抽象已经和操作系统对0,1,2这样的fd定义没什么关系了

2. typedef void(*Function)(void);      #define FUNC(u16Val) (*(Functionu16Val)()

这两句话是什么意思?

coder:

        Function是个函数指针,返回值和参数都为空, FUCN这个宏把其参数u16Val中的值强制转换成为函数指针并进行调用。

3. void * void *)有什么区别?

coder

        void (*)是个不正确的定义。完整的至少应该是void (*)()这样的,这代是一个未命名的返回值为void的函数指针,声明函数原型时可以当做占位符,void* 是代表个一任意类型的指针。

4.socket传输问题时,应注意什么?

coder:

        要看你使用的协议,如果是TCP你需要自己代码中识别消息块边界,如果是UDP那需要注意包大小不能超过MTU限制,而且UDP可能会丢包。

5. 空格的ascII码是0吗?

coder:

        32

6.xp如何安装ipv6?

coder:

        xp 直接在命令行打 ipv6 install

7. str=='/0'、str==''和str=null有什么区别?

coder:

       NULLC下是(void*)0cpp下是0,所以说str==null比较是针指比较是代表指针本身是否为空,str=='/0'表示的是str所指向的字符是否为ascii的空字符,c式字符串需要以此字符来结尾。'/0'代表空的字符,空的字符本身也是字符而不是没有字符,''代表空字符就是说没有任何字符,没有办法对字符赋以''值,它表示的是没有任何字符。而""可以赋值给一个字符串,因为""的含义是表示一个以"/0"结尾的字符串。

8. const放在成员函数前后有什么作用?

 coder:

         放在前面是修饰函数返回值的。放在后面是修饰函数本身的,放在前面的话这个const只和函数返回值有关系和整个函数没什么关系,而放在后面表示这个函数(const放在后只能修饰成员函数)是常量性函数,在其函数定义中不会修改任何成员变量也不会调用其它非const成员函数。如果一个对象为const类型那么只能调用这个对象的const成员函数,就是说const放在后面的那种。 

9. _T这个玩意是啥意思?看到有函数调用总是有这玩意? 例如AfxMessage(_T(“测试”))

coder:

         _T_TEXT的别名,是个宏定义。这个宏有在对字符的转义中,因为字符通常是分为unicodeANSI的,对于unicode来说TCHAR表示的是wchar_tANSI表示的是char,LPCTSTRunicode中表示const wchar_t* 而在ANSI下表示const char*,通常有字符串参数的系统API实供上提供的是两个API,比如说GetWindowTextWGetWindowTextA,结尾的WA用于区别是wide(宽字符)还ANSI字符,系统并没有GetWindowText这样的API,但是在系统提供的头文件中进行了定义,类似#ifdef _UNICODE #define GetWindowText GetWindowTextW #else #define GetWindowText GetWindowTextA #endif 这样实际在代码中调用的API都是这样的宏。当工程的字符集选择的是UNICODE时那么IDE会定义_UNICODE这个宏,从而实际调用的就是Wide版本的API反之是ANSI,又由于字符在C语言本身的表示问题C语言标准库也提供了相应的宏定义,所以你需要知道的就是为了适应程序对不同字符集的自适应所以才有的_T_TEXT,它们的定义是在UNICODE下为L(这样_T("AB")就成为L"AB"这表示是一个宽字符串),而在ANSI下什么都不做。

所有关于字符串操作的函数都有相应的宽字符函数。VCCRT提供了_t开头的转换定义根据编译条件来链接相应的unicode ansi函数,操作系统提供了另一个层次函数定义,涉及字符串的API都有WA两种,windowskernel.dll也导出了以l开头的字符串操作函数如lstrlen等,所以可使用api的语言都可以利用这些api来操作字符串。整个字符集这块内容还是相当不少的。

10.char a[10];

memset(a,0,sizeof(a))a[0] = '/0' 这两个有啥区别?

coder:

       char a[10];//定义数组 memset(a,0,sizeof(a));//设定数组所有元素为0 a[0]='/0';//设定数组第一个元素为ASCII的空字符,由于ASCII的空字符对应的码值是0所以和使用数字0设定相同(建议使用'/0'而非直接使用0,因数这样就规避了编译器对类型的检查)。 以下两种初始化数组的方式更好些: char a[10]={0};//定义数组并初始化所有元素为0; char a[10]="/0";//由空字符串来初始化字符数组。 这两种初始化在编译器就完成了不会占用程序的运行时间。只会占用程序的启动加载时间。当使用其它的类型比如说宽字符集时这两种初始化更方便使用。 wchart a[10] = {0}; wchart a[10] = L"/0"; 而使用memset必须这样 wchart a[10]; memset(a,0,sizeof(a)/sizeof(wchar_t)); 由于sizeof返回的是字节大小,而wchart_t占用两个字节,memset是以指针操作为基础,那么如果不这样做就会破坏内存,因为以a开始加上sizeof(a)的长度实际上相当于两倍的a数组的空间长度了。其它类型的问题也类似。

11GetDesktopWindow获取的是不是真实的桌面窗口hwnd

coder:

        GetDesktopWindow获取的不是真实的桌面窗口hwnd, hDesktopDesktophwnd没错。可desktop并不是你看起来的desktop,所以才需要findwindow

       HWND hDesktop = ::FindWindow(_T("Progman"),NULL);//GetShellWindow();

            if(hDesktop)
             {
                hDesktop = ::GetWindow(hDesktop,GW_HWNDFIRST);

             }

            while (hDesktop)

              {

                    HWND hShell = ::FindWindowEx(hDesktop,NULL,_T("SHELLDLL_DefView"),NULL);     

                   HWND h = ::FindWindowEx(hShell,NULL,_T("SysListView32"),_T("FolderView"));

                   if(h)

                    {

                         ::SendMessage(h,WM_LBUTTONDBLCLK,MK_LBUTTON,MAKELPARAM(10,10));            ::SendMessage(h,WM_LBUTTONUP,MK_LBUTTON,MAKELPARAM(10,10)); return 0;

                    }

                  hDesktop = ::GetWindow(hDesktop,GW_HWNDNEXT);

               }

12. warning: memset used with constant zero length parameter; this could be due to transposed parameters. 这个错误哪位知道啊

coder:

         gcc 好像4.4以后的版本就对这个检查的很严格了。不是error没事。sqlite的官方上有报告这个问题。回答是这属于gcc的一个bug。可以更换gcc的版本。不过apt安装算是最简单的了

13.设计视频直播思路是什么?

coder:

        视频从应用上大体有三种方式,一是以讯雷看看、pplive,ppstream为代表的p2p解决方案,这种方案要求完整的开发播放器、开发适合多媒体的p2p协议。二是以QuickTime Streaming ServerRealServerWindows Media Server为代表使用RTSP (Realtime Streaming Protocol)MMS (Microsoft Media Server)协议的流媒体解决方案。这类方案贵成熟业务性强是代替电视类应用的在线媒体解决方案,最后就是类似youku网这样的基于web的方案其核心是Adobe公司的flv流媒体。每种方式都有自己特长的地方和不足的地方比如说流媒体对服务器带宽的要求过高从而造成费用过高不是一般企业可能承受的。p2p是最廉价的方式,不过把开发的要求也就更高了。

14. setmap的数据结构?

setmap的内部数据结构都使用平衡二叉树来管理元素,通常会实现为红黑树,所以就成这样了。

setmap都属于已序容器,修改操作都会导至元素的排序。

默认是使用<进行比较,当然也可自定义比较操作

二叉排序树:左边的节点都比父节点小,右边的节点都比父节点大

 

 

 

原创粉丝点击