user-0 提问: 请教从事c语言开发高手的几个问题

回复:
user: user-1
content: 操作系统一般是不用测试的。 一个编译器，一般不会在不同操作系统下，使用同一分可执行代码。 而编译器的开发者知道，编译器要在哪个操作系统下运行；  可以编译那个操作系统的代码。 一般都会针对不同操作系统，硬件平台，去开发对应的编译器。  不论如何，你都知道，开发工具，运行在哪个操作系统，硬件平台。 开发出来的程序，运行在哪个操作系统，硬件平台下。  所以，不用检测操作系统，最多来个宏定义。 不过，同一操作系统的不同版本，是可以检测的。 比如Windows NT，Windows 2000，Win8等。  Windows 上，检测当前该操作系统，是否linux 是没有必要的，反之也一样。 因为他们之间是不兼容的，针对不同系统的程序，不能在非对应系统上运行。

user: user-2
content: 引用 18 楼 king_2007 的回复:引用 17 楼 zhao4zhong1 的回复:用WinMain请问那可以移植到liunx上吗？ linux下用Qt

user: user-2
content: 用WinMain

user: user-0
content: 引用 17 楼 zhao4zhong1 的回复:用WinMain请问那可以移植到liunx上吗？

user: user-2
content: SetLayeredWindowAttributes Function  --------------------------------------------------------------------------------  The SetLayeredWindowAttributes function sets the opacity and transparency color key of a layered window.  Syntax  BOOL SetLayeredWindowAttributes(          HWND hwnd,     COLORREF crKey,     BYTE bAlpha,     DWORD dwFlags ); Parameters  hwnd [in] Handle to the layered window. A layered window is created by specifying WS_EX_LAYERED when creating the window with the CreateWindowEx function or by setting WS_EX_LAYERED via SetWindowLong after the window has been created. crKey [in] COLORREF structure that specifies the transparency color key to be used when composing the layered window. All pixels painted by the window in this color will be transparent. To generate a COLORREF, use the RGB macro. bAlpha [in] Alpha value used to describe the opacity of the layered window. Similar to the SourceConstantAlpha member of the BLENDFUNCTION structure. When bAlpha is 0, the window is completely transparent. When bAlpha is 255, the window is opaque. dwFlags [in] Specifies an action to take. This parameter can be one or more of the following values. LWA_COLORKEY Use crKey as the transparency color. LWA_ALPHA Use bAlpha to determine the opacity of the layered window. Return Value  If the function succeeds, the return value is nonzero.  If the function fails, the return value is zero. To get extended error information, call GetLastError.     Remarks  Note that once SetLayeredWindowAttributes has been called for a layered window, subsequent UpdateLayeredWindow calls will fail until the layering style bit is cleared and set again.  For more information, see Using Layered Windows.  Function Information  Minimum DLL Version user32.dll  Header Declared in Winuser.h, include Windows.h  Import library User32.lib  Minimum operating systems Windows 2000   See Also  Windows Overview, Using Layered Windows, AlphaBlend, CreateWindowEx, SetWindowLong, TransparentBlt, UpdateLayeredWindow, COLORREF, RGB  --------------------------------------------------------------------------------

user: user-0
content: 引用 15 楼 zhao4zhong1 的回复:SetLayeredWindowAttributes Function  --------------------------------------------------------------------------------  The SetLayeredWindowAttributes function sets the opacity and transparency color key of a layered window.  Syntax  BOOL SetLayeredWindowAttributes(          HWND hwnd,     COLORREF crKey,     BYTE bAlpha,     DWORD dwFlags ); Parameters  hwnd [in] Handle to the layered window. A layered window is created by specifying WS_EX_LAYERED when creating the window with the CreateWindowEx function or by setting WS_EX_LAYERED via SetWindowLong after the window has been created. crKey [in] COLORREF structure that specifies the transparency color key to be used when composing the layered window. All pixels painted by the window in this color will be transparent. To generate a COLORREF, use the RGB macro. bAlpha [in] Alpha value used to describe the opacity of the layered window. Similar to the SourceConstantAlpha member of the BLENDFUNCTION structure. When bAlpha is 0, the window is completely transparent. When bAlpha is 255, the window is opaque. dwFlags [in] Specifies an action to take. This parameter can be one or more of the following values. LWA_COLORKEY Use crKey as the transparency color. LWA_ALPHA Use bAlpha to determine the opacity of the layered window. Return Value  If the function succeeds, the return value is nonzero.  If the function fails, the return value is zero. To get extended error information, call GetLastError.     Remarks  Note that once SetLayeredWindowAttributes has been called for a layered window, subsequent UpdateLayeredWindow calls will fail until the layering style bit is cleared and set again.  For more information, see Using Layered Windows.  Function Information  Minimum DLL Version user32.dll  Header Declared in Winuser.h, include Windows.h  Import library User32.lib  Minimum operating systems Windows 2000   See Also  Windows Overview, Using Layered Windows, AlphaBlend, CreateWindowEx, SetWindowLong, TransparentBlt, UpdateLayeredWindow, COLORREF, RGB  --------------------------------------------------------------------------------请问高手，第二个问题是用int APIENTRY WinMain(HINSTANCE hlnstance,       HINSTANCE hPrevInstance,       LPSTR lpCmdline,       int nCmdShow)还是用int main()作为主函数？？

user: user-3
content: 引用 12 楼 Liu_peiqi 的回复:[quote=引用 9 楼 alex_my 的回复:] [quote=引用 8 楼 zhao4zhong1 的回复:] 做个可能不太恰当的比喻： 人想让狗帮忙逮只兔子，可是人说话狗听不懂，于是人发明了一种介乎人言和狗语之间的语言，即口令。 人想让电脑帮忙做计算，可是人话电脑听不懂，于是人发明了一种介乎人言和汇编机器码之间的语言，即C语言。 人对狗的口令得让人容易学、也得让狗容易懂。 C语言同样得让人容易学、也得让电脑容易懂。 相比之下C++、Java就是人学得费劲、电脑也经常闹不懂。  最后三句还是非常恰当的。[/quote]又陷入了语言之争。。。。。。。。。。恰当的工具用到恰当的事情上，语言，只是一种工具。。。。。。个人理解，工具无好坏，只有适用不适用。 献丑了[/quote] 每天回帖即可获得10分可用分！

user: user-4
content: 引用 8 楼 zhao4zhong1 的回复:做个可能不太恰当的比喻： 人想让狗帮忙逮只兔子，可是人说话狗听不懂，于是人发明了一种介乎人言和狗语之间的语言，即口令。 人想让电脑帮忙做计算，可是人话电脑听不懂，于是人发明了一种介乎人言和汇编机器码之间的语言，即C语言。 人对狗的口令得让人容易学、也得让狗容易懂。 C语言同样得让人容易学、也得让电脑容易懂。 相比之下C++、Java就是人学得费劲、电脑也经常闹不懂。  最后三句还是非常恰当的。

user: user-2
content: 做个可能不太恰当的比喻： 人想让狗帮忙逮只兔子，可是人说话狗听不懂，于是人发明了一种介乎人言和狗语之间的语言，即口令。 人想让电脑帮忙做计算，可是人话电脑听不懂，于是人发明了一种介乎人言和汇编机器码之间的语言，即C语言。 人对狗的口令得让人容易学、也得让狗容易懂。 C语言同样得让人容易学、也得让电脑容易懂。 相比之下C++、Java就是人学得费劲、电脑也经常闹不懂。

user: user-5
content: 引用 11 楼 jerry_dqh 的回复:[quote=引用 5 楼 mujiok2003 的回复:] [quote=引用 4 楼 AnYidan 的回复:] [quote=引用 1 楼 mujiok2003 的回复:] 1. 一把利刃，但是面对超大规模应用，产能不足。  2. 条件编译 3. 执行效率主要来自优秀的算法和架构，而不是优化。  目前c 有超大规模的应用？   C 基本上在底层，与硬件密切相关之处[/quote] 因为不合适，所以没有。 [/quote] 也是有超大规模应用的。不过不是桌面应用。[/quote] 后台服务器Linux/UNIX为主！超大规模也就是在这一块了，比如炒的很热的大数据，云，APU杂七杂八的。个人觉得C还是能胜任的，只是不同的语种编码的劳动量，实现的方式不同而已！  执行速度不能靠编译器，算法与架构才是核心！

user: user-6
content: 引用 9 楼 alex_my 的回复:[quote=引用 8 楼 zhao4zhong1 的回复:] 做个可能不太恰当的比喻： 人想让狗帮忙逮只兔子，可是人说话狗听不懂，于是人发明了一种介乎人言和狗语之间的语言，即口令。 人想让电脑帮忙做计算，可是人话电脑听不懂，于是人发明了一种介乎人言和汇编机器码之间的语言，即C语言。 人对狗的口令得让人容易学、也得让狗容易懂。 C语言同样得让人容易学、也得让电脑容易懂。 相比之下C++、Java就是人学得费劲、电脑也经常闹不懂。  最后三句还是非常恰当的。[/quote]又陷入了语言之争。。。。。。。。。。恰当的工具用到恰当的事情上，语言，只是一种工具。。。。。。个人理解，工具无好坏，只有适用不适用。 献丑了

user: user-7
content: 引用 5 楼 mujiok2003 的回复:[quote=引用 4 楼 AnYidan 的回复:] [quote=引用 1 楼 mujiok2003 的回复:] 1. 一把利刃，但是面对超大规模应用，产能不足。  2. 条件编译 3. 执行效率主要来自优秀的算法和架构，而不是优化。  目前c 有超大规模的应用？   C 基本上在底层，与硬件密切相关之处[/quote] 因为不合适，所以没有。 [/quote] 也是有超大规模应用的。不过不是桌面应用。

user: user-0
content: 请各位能不能不要空谈，先把第二个问题的代码贡献出来让我看看,再谈其他两个问题好不好。

user: user-8
content: 1， 开发效率高，堆代码无脑，执行速度不用担心（前提是你的设计和实现细节是靠谱的）。 2， 真不知道。 3， C99都多老的东西了，很难找到不支持的编译器。

user: user-9
content: 1 c语言比较灵活，局限性比较小，用于底层和硬件直接打交道偏多， 2 个人主要工作环境Linux下，为了代码的可移植性性，添加兼容windows的宏定义，   对于图形编程qt比较好用！   现在的语言比较多，各个方面的语言都有自己的独特的一面，所以灵活运用会比较靠谱 3 编译器对代码执行速度没有任何关系，只是源码通过编译器生成执行文件，运行时独立于编译器的！   当然编译器可能会对编译的速度有一定的影响，但是不是关键因素，优化代码才是关键！

user: user-10
content: 引用 4 楼 AnYidan 的回复:[quote=引用 1 楼 mujiok2003 的回复:] 1. 一把利刃，但是面对超大规模应用，产能不足。  2. 条件编译 3. 执行效率主要来自优秀的算法和架构，而不是优化。  目前c 有超大规模的应用？   C 基本上在底层，与硬件密切相关之处[/quote] 因为不合适，所以没有。

user: user-11
content: 引用 1 楼 mujiok2003 的回复:1. 一把利刃，但是面对超大规模应用，产能不足。  2. 条件编译 3. 执行效率主要来自优秀的算法和架构，而不是优化。  目前c 有超大规模的应用？   C 基本上在底层，与硬件密切相关之处

user: user-12
content: 引用 1 楼 mujiok2003 的回复:1. 一把利刃，但是面对超大规模应用，产能不足。  2. 条件编译 3. 执行效率主要来自优秀的算法和架构，而不是优化。说的也不错。。。

user: user-12
content: 俺一名嵌入式码农，搞了快两年了，略述己见，勿怪。 一、在实际工作中，C语言其实开发效率比其他语言稍低，但是对于操作硬件来说是把快刀。其主要的难点基本就在于宏和指针，实际上我搞开发那么长时间了，也没有参透指针，工作中还是会出现很多问题。在linux中，C语言几乎是一统天下的，很多多库，命令都是用C语言实现的，这些都是值得借鉴的。对于我来说，C语言就是入门简单，到后面知道的越多，就感觉越难。 二、一般可移植的库中都有这么一个宏定义：#ifdef WIN32 #else #endif。在linux中实现图形界面可以用第三方库，gtk或者qt。 三、编写可移植的代码建议还是用c89吧。至于编译器，linux上gcc，lc，windows上的就cl，还有intel的一个编译器也比较不错。 现在计算机硬件成本越来越低，cpu的执行速度已经很快了，其实执行速度跟编译器的关系已经很小了。

user: user-10
content: 1. 一把利刃，但是面对超大规模应用，产能不足。  2. 条件编译 3. 执行效率主要来自优秀的算法和架构，而不是优化。