C语言
youyudexiaowangzi
读书苦,读书累,晓来谁染霜林醉,名落孙山泪
展开
-
终端截获ctrl+c,非阻塞获取按键事件
截获ctrl+c,通过api SetConsoleCtrlHandler监听部分事件,除了ctrl+c还有关机和账户退出事件。ctrl+c通过api signal注册回调事件SIGINT,也就是结束事件。kbhit判断当前是否已经有按键按下,如果有,就调用getch。默认getchar,fgetc需要敲回车后才会返回,按键之后直接返回,不用等待输入回车。windows非阻塞监听按键。linux非阻塞监听按键事件。原创 2022-09-16 11:04:26 · 426 阅读 · 0 评论 -
linux C获取Mac地址
此处是通过设置ifr_name,然后通过ioctl获取mac地址,ifr_name一般是eth0或者ens33。无论是否联网都可以获取到,但是当程序运行在其他客户端,不可能要求用户那里的网卡名称也是eth0,所以此方法仅能用作本地测试,或者用命令行方式传入网卡名称,然后获取指定网卡名称的mac地址。可是ifconfig命令不是更好用更方便吗?ioctl调用SIOCGIFCONF只能获取到活动网卡,如果把ens33或者eth0的网络连接断开,就获取不到了。1.基础用法,获取eth0的mac地址。.......原创 2022-07-28 19:58:08 · 2711 阅读 · 0 评论 -
linux恶心的宽字符
在windos平台wchar_t是2个字节,可以正好存放一个unicode字符,可是linux平台的wchar_t却是4个字节,导致windows平台和linux平台之间数据传递的时候可能会出现数据覆盖,加入windows平台定义了一个结构体,里面某个字段是WCHAR类型的数组,然后把头文件移动到linux平台编译,如果不重定义WCHAR会编译不通过,但是重定义WCHAR为short的话,linu原创 2015-10-21 10:36:44 · 2510 阅读 · 1 评论 -
windows服务程序弹出有界面的MessageBox
WTSSendMessage可以在指定的用户会话中弹出对话框,获取用户会话可以用WTSGetActiveConsoleSessionId获取当前活动用户的会话idOE_UINT32 sessionId = WTSGetActiveConsoleSessionId();DWORD dwRespon = 0xff;if(!WTSSendMessage((HANDLE)0, se原创 2015-11-05 11:03:00 · 2950 阅读 · 0 评论 -
linux c fopen修改已经存在的文件
fopen有r、w、a等打开模式,t、b两个文件模式(文本或二进制)用w、wb、w+b打开,无论如何都会清空原来文件中的数据,很麻烦,如果要多次读取修改文件,清空不是很理想的解决方案,a、ab、a+b不会破坏原来数据,但只能添加到原来文件数据的后面,fseek基本失效,这样就修改不了原来的数据了,r虽然不会破坏,但是修改不了,这个时候如果用r+b、r+就可以在保留文件原来内容的情况下设置文件指原创 2015-10-21 14:48:49 · 2344 阅读 · 0 评论 -
linux c 两次使用localtime,结果第一个被改变了
time_t BeginTime,EndTime;struct tm *time1,*time2;time(&BeginTime);time1 = localtime(&BeginTime);dosomething();time(&EndTime);time2 = localtime(&EndTi原创 2015-10-22 11:27:21 · 1510 阅读 · 1 评论 -
warning C4366: The result of the unary '&' operator may be unaligned
warning C4366: The result of the unary '&' operator may be unaligned这个错误的意思是取地址的对象不是内存对齐的,比如#pragma pack(1)struct a{int a;char b;double c;char d;}#pragma pack()如果取结构体a的地址是没原创 2015-09-22 19:03:27 · 2084 阅读 · 0 评论 -
linux编译多文件程序
Makefile文件gcc -o test2.exe test.c a.c#a.o: a.cgcc -c a.c -o a.o#main.o: test.cgcc -c test.c -o main.o#main: main.o a.ogcc -o test.exe main.o a.o#clean:rm *.o#run./test2原创 2015-09-23 16:39:56 · 468 阅读 · 0 评论 -
linux编译调用动态库
库testlib.c#include int testlib(){printf("this is a lib");}程序test.c#include int testlib();int main(){printf("hello world \r\n");testlib();getchar();return原创 2015-09-23 16:09:12 · 306 阅读 · 0 评论 -
linux编译调用静态库
库testlib.c#include int testlib(){printf("this is a lib");}程序test.c#include int testlib();int main(){printf("hello world \r\n");testlib();getchar();原创 2015-09-23 15:16:02 · 578 阅读 · 0 评论 -
Mac OS X上使用XCode编译调用OS X的动态库
首先创建XCode工程的时候选择Framwork & Library,然后创建动态库dynamic接下来的编码就像windwos或者linux中一样,最后生成的是dylib后缀的动态库,生成方式是XCode菜单栏->produce->archive编译通过后会生成dylib后缀的动态库,编写应用程序调用动态库的时候对工程进行设置,(最后生成xxx.dylib,假定我把动态库原创 2015-12-10 17:12:15 · 4953 阅读 · 1 评论 -
记录一个很奇怪的c语言某某lib中某某函数already defined in 某某.lib
今天编译一个程序,会用到很多库,编译时报错aaa.lib(AAA.obj) error LNK2005 InRangEx already defined in bbb.lib (BBB.obj)确实这个函数在两个库中都有声明和实现,但是两个库除了本身文件外,还共同使用的了同一头文件和源文件,然后程序引用这两个库的时候报错了,程序本身并不引用那个共同头文件中的函数,不管怎么rebuild都没用,这个原创 2018-01-18 09:28:02 · 648 阅读 · 0 评论 -
windows平台socket编程编译错误error C2065: ‘SOCKET‘ : undeclared identifier
errorC2065:'SOCKET':undeclaredidentifierLPFN_ACCEPTEX' : undeclared identifiererror C2011: 'sockaddr_in' : 'struct' type redefinition写代码的时候要用到SOCKET、LPFN_ACCEPTEX、WSA系列api,也就是会用到#include ...原创 2018-06-06 12:02:29 · 2187 阅读 · 0 评论 -
c语言使命令支持 | 和 <
比较常见的命令组合方式:ll | grep log这是两个命令的组合grep识别ll命令输出的每一行的文本,然后将符合匹配的一行文本输出也可以这样echo "aaabbbbb" | grep ab道理一样,echo输出一行文本,grep获取然后解析还有一个例子mysql -uusername -ppassword db1 <tb1tb2.sql...原创 2019-04-15 16:54:41 · 182 阅读 · 0 评论 -
GetFirmwareEnvironmentVariable失败返回错误码1314
GetFirmwareEnvironmentVariable是获取efi主板写入到固件里的数据,如果单单调用#define VariableGuidStr "{8BE4DF61-93CA-11D2-AA0D-00E098032B8C}"#define BootOrderStr "BootOrder"DWORD dwRet = 0;原创 2015-09-06 16:02:43 · 3866 阅读 · 0 评论 -
Windows编译动态库时选择是否同时导出静态库
如果只是单纯的编译静态库,最后生成的文件就是一个静态库lib,但是如果编译动态库的话可以选择是否同时导出静态库,有静态库的话编程也方便一点,只要在要导出的函数前面加上__declspec(dllexport)或者extern “C”即可。如果头文件为了通用,不仅一个平台使用,可以用宏隔开#ifdef MY_EXPORT#define MY_FUNC_API extern "C" _原创 2015-07-16 12:53:45 · 805 阅读 · 0 评论 -
error C2664: 'CWnd::FromHandle' : cannot convert parameter 1 from 'unsigned long' to 'HWND'
有的程序为了通用,会定义一个头文件,然后把各种类型重新定义一遍,在debug和release不同版本下可能结果不一样,但是debug版本会使用一些vc内的库,导致没装vc或vs的计算机不能运行,换成release版本后又可能有一些宏问题,比如有的宏针对于debug或者release导致版本交换后的错误如:error C2664: 'CWnd::FromHandle' : cannot原创 2015-02-03 15:56:31 · 1128 阅读 · 0 评论 -
处理字符串的时候遇到的一个小bug,但是一整天都没发现的bug
sprintf_s(Debugmsg, DEBUG_MSG_LEN, "in put loginfo gonna to add new loginfo in buffer LogSize : %d LogLen : %d LogSzie%BytesPerSec : %d \r\n", LogSize,LogLen,(LogSize%BYTES_PER_SEC));就是原创 2015-04-01 15:25:37 · 372 阅读 · 0 评论 -
头文件中添加了防止重复包含的宏,依旧报重复定义的问题
一个头文件中会包含另外一些头文件和函数,只要注意层次问题一般不会说函数或结构体重复定义,但如果想在头文件中定义全局变量就会出问题了,因为每个c或者cpp文件都会找自己的变量是从哪里定义的,链接器会寻找c或cpp文件中包含的头文件和头文件中包含的头文件,不像普通函数和结构体定义的那样,声明即可变量可能会报很多错。所以全局变量最好定义在c或者cpp文件中,然后在一个头文件中用extern声明之,这原创 2015-04-11 14:29:47 · 1460 阅读 · 0 评论 -
函数命名只定义、实现了一次,却被提示早已定义
本来为了方便管理,可以将各种模块分成各自的文件存放,只要添加进源文件,编译器会自己链接源文件,头文件用于声明,但是如果把声明和实现都放在头文件里,可能会出问题,如果只是使用一次不会发现,如果多个文件都包含该头文件,就会说早已定义,即使添加了防止重定义的宏也没用,因为实现是在这个头文件的话,依旧每个其他文件都要来找实现,于是重复定义了。类似C:\Program Files (x86)\Micro原创 2015-04-25 16:00:40 · 736 阅读 · 0 评论 -
Failed to save the updated manifest to the file
今天维护一个项目,试着编译了一下,感觉没改什么大的东西,但是报错:Failed to save the updated manifest to the file把现在的工程和原来的工程对照了一下,发现xxx.exe.intermediate.manifest文件不见了,虽然不知道是不是自己手误删的,但是看其他项目里面没有这个文件也可以通过,不明白为什么,把原来的清单文件加进去又好了原创 2015-04-29 11:48:36 · 583 阅读 · 0 评论 -
fatal error C1903: unable to recover from previous error(s); stopping compilation
遇到这种问题有时候是自己不小心导致的{}问题或者其他语法错误如果不是语法问题,那就得,考虑VC9的自身bug,微软官方有提供一种解决方法:在所在工程的属性里面进行如下设置property-->C\C++--> General -->Debug Information format ======= C7 Compatible (/Z7)C\C++--> Code Gene原创 2015-04-28 15:54:32 · 15151 阅读 · 0 评论 -
LINK : fatal error LNK1104: cannot open file 'xxx.exe'
自己编写的程序就是用来生成exe文件的,应该不会出现不能运行的情况,可是在任务管理器中一查看,发现好多同名的程序被挂起,这个时候结束掉那些同名的程序就可以了原创 2015-05-13 14:05:45 · 398 阅读 · 0 评论 -
无法定位程序输入点 于动态链接库
好不容易把程序编译通过,又报"无法定位程序输入点 于动态链接库"错误,原来是库早就被更新了,但是自己没有更新导致运行时链接出错,这个时候把动态库更新为最新状态即可原创 2015-05-13 14:13:24 · 1770 阅读 · 2 评论 -
unresolved external symbol __chkstk
unresolved external symbol __chkstk,主要发生在构造结构体对象的时候,如果是直接new一个对象的话,这个问题可以避免,如果直接构造一个大的数据结构会报这个错误,用来提示说堆栈错误,堆栈空间有限,所以最好把大的数据结构用申请内存的方式申请空间原创 2015-05-29 14:39:23 · 623 阅读 · 0 评论 -
UNREFERENCED_PARAMETER,函数定义中没有使用函数入口的参数列表中的参数
有些时候定义了一个函数之后,函数的参数列表中的参数不一定会被调用,例如一般的main函数中就有参数不一定会被使用,还有就是回调函数,当初接口已经定义好了,现在自己写的函数只想使用其中某个参数,这个时候就会造成某些参数不被使用,如果编译的时候使用高级别的警告级别,那么就会发出警告,一般低级别的警告不会检查函数入口的参数列表中的函数是否都被使用,想要在高级别的警告级别下避免类似警告可以使用UNREFE原创 2015-06-06 09:36:42 · 886 阅读 · 0 评论 -
error PRJ0002 : Error result 31 returned from 'C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\mt.
本来代码写的好好的,可以正常编译通过,突然编译的时候报error PRJ0002 : Error result 31 returned from 'C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\mt.明明刚才还编译通过的,为什么现在出现这个错误呢,不知道,但是可以通过设置让其编译通过,在属性中设置link-->Manifest File,然后设原创 2015-06-09 12:52:02 · 2232 阅读 · 0 评论 -
do{}while(0)
#define LOG_ERROR(format, ...) \do { \SYSTEMTIME _time; \GetLocalTime(&_time); \DebugPrint(_T("[%4d-%02d-%02d %02d:%02d:%02d][ERROR][%s,%d] ") format, \_time.wYear, _time.wMonth, _time.wDay,原创 2015-07-13 15:58:54 · 292 阅读 · 0 评论 -
定义窄字符串,变形为宽字符串
#define CHAR_STRING "string"#define _w(x) L##x#define w(x) _w(x)如果窄字符串和宽字符串都定义一次有点浪费,而上述方法可以使得一个字符串定义后可以使用w()转定义为宽字符串,要用宽字符床的时候使原创 2015-07-14 13:39:20 · 843 阅读 · 0 评论 -
mfc申请管理员权限
又是程序没有管理权限可能导致不能如期望那样运行,所以在运行时可能导致调用驱动或者内核的时候出现问题申请管理员权限需:属性-->链接器-->清单文件-->用户账户级别-->请求管理员权限。用英文表示就是(Property-->Linker-->Manifest file-->UAC execute level-->requireAdminstor)原创 2015-02-04 13:13:51 · 1213 阅读 · 0 评论