c语言一些技巧经验

一、在C语言中,可以使用Windows API来创建提示窗口。下面是一个简单的示例代码:

  1. #include <windows.h>
  2. int main() {
  3.     MessageBox(NULL,"Hello, world! ","提示窗口",MB_OK);
  4.     return 0;
  5. }
bash

上述代码调用了MessageBox函数来创建一个提示窗口。MessageBox函数有四个参数:.hwnd:窗口的句柄,可以设置为NULL。

. lpText:提示信息的字符串。

. lpCaption:窗口标题的字符串。

二、warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]

1、错误代码展示

函数定义:

void readImage(char *inputPath);

函数使用:

 readImage("C:\\xxxx\\girl.jpg");

2、原因分析

在上面的方法中,方法的参数需要我们传递一个指针类型的字符。而我们在使用该方法的时候传递的确实一个常量。会导致常量强转为指针,因为会报这么一个警告。这个警告在有些编译器上就直接通不过了,有些编译器上可以通过。

3、解决办法

解决办法也非常的简单,如下所示:

  1. char *inputPath = (char*)"C:\\xxx\\girl.jpg";
  2. readImage(inputPath);
bash

三、报错waring:multi-character character constant [-Wmultichar]

1、检查你的char数组的元素是否单个元素进行赋值,如char[n] = ‘a’,只能是一个元素。

2、检查输出的单引号问题

3、printf和cout输出%c类型是的空格,对于cin最最好是分开输出空格,printf就不会出现问题。

四、解决C语言编译后无交互不想显示黑框,却总是带着黑框的问题

1. 编写了wIndows窗口程序或者默认的main运行程序,没有交互,只是有序执行一些命令,增加了下面的设置,但还是有个黑框,设置为:

  1. #pragma comment(linker, "/ENTRY:WinMain")
  2. #pragma comment(linker, "/SUBSYSTEM:WINDOWS")
bash

2. 利用WinHex工具打开编写后的程序,在0xD0C位置,将03修改为02保存,即可显示黑框。网上说的好像是0x130~0x140的区间,可是这个区间没有03的数值。

其他教程:VC中如何编译无Console窗口的Console程序

五、Windows网络编程 undefined reference to `__imp_WSAStartup‘ 解决办法

第一步:头文件末尾增加一行:#pragma comment (lib,“ws2_32”),如下:

  1. #include <string.h>
  2. #include <stdio.h>
  3. #include <winsock2.h>
  4. #include <time.h>

  5. #pragma comment (lib,"ws2_32")    //静态加入一个lib文件,也就是库文件ws2_32.lib文件,提供了对网络相关API的支持
  6. /*
  7. 关于WSAStartup方法和WSACleanup方法引用出错的解决:
  8. 错误:
  9. 编译的时候出现 
  10. undefined reference to `__imp_WSAStartup'
  11. undefined reference to `__imp_WSACleanup'
  12. 在一般编译器中不会直接连接编译wsock动态库,需要手动添加库
  13. 首先可以尝试代码中直接引入动态库,#pragam comment(lib,"ws2_32");
  14. 如果不行再手动添加库
  15. 在vc中,点项目(project-->project option)在makefile中输入-L"ws2_32" 
  16. 在dvc C++中点击工具(Tool)-->编译选项(Compile Option)在编译命令框中输入-lwsokt32
  17. */
bash

第二步:gcc编译命令后添加 -lwsock32,我建立的批处理.bat,把cpp文件拖动上来自动编译、压缩、加壳如下:

  1. @ECHO OFF
  2. SET filename=%1
  3. SET newname=%filename:~0,-4%.exe
  4. gcc %filename% -o %newname% -lwsock32 && strip %newname% && upx %newname%
  5. pause
bash