基础用法

define
define的基础用法: 将标识符定义为后面的常量

#define 标识符 常量 //最后没有分号
  1. C语言中以#开头的均为预处理命令,且以#开头的都是宏定义,用宏名表示一个常量,好处是"方便程序的修改"
#define NUM 5 

位运算符
<< 二进制左移运算符,将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)。如60(00111100) << 2 得到240
|或运算符
按二进制位进行或运算

  • 输入输出规范
    c语言中符合%#的意思是带格式输出
    比如,%#x的意思是在输出前面加上0x,%#b的意思是在输出前面加上0b,c语言中的%#x意思是带格式0x的16进制输出。

进阶用法

  • glob库函数的使用
    如果glob返回的是非零值,则说明路径不存在
    glob("path",0, NULL, &buf);// 从path获取配置文件并读取到buf中
#include <stdio.h>
#include <glob.h>
 
 int main(int argc, const char *argv[])
 {
     glob_t buf;
     int i;
     i = glob("/Users/panlanlan/Documents/project/baidu/c/test_bvrouter/1",0, NULL, &buf);                                                                                  
     printf("%d\n", i);
     for(i=0; i < buf.gl_pathc; i++)
     {
         printf("buf.gl_pathv[%d]= %s \n", i, (buf.gl_pathv[i]));
     }
 
    globfree(&buf);
     return 0;
 }
  • 获取当前路径
    getcwd()函数的使用
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int main(void)
{
  char *path = NULL;
  path = getcwd(NULL,0);
  puts(path);
  free(path);
  return 0;
}
  • GCC diagnostic push的使用

test1函数就是被忽略的,main()函数只输出test2的结果

/************************************************************************/
//记录当前的诊断状态
#pragma GCC diagnostic push
//关闭警告,诊断忽略没有返回值
#pragma GCC diagnostic ignored "-Wreturn-type"

int test1(void)
{
    return;
}
//恢复到之前的诊断状态
#pragma GCC diagnostic pop

/************************************************************************/
int test2(void)
{
    return;
}

int main(int argc, char* argv[])
{
    test1();
    test2();
    
    return 0;
}
  • printf()和fprintf()的区别
    fprintf是将字符输出到流(文件)的,printf是输出到标准设备(stdout)的。
int fprintf( FILE *stream, const char *format, [ argument ]...);
int printf( const char *format [, argument]... );
  • strdup():复制字符串
    参考
  • chdir():改变当前的工作目录
    参考
  • container_of(ptr,type,member)的理解
    container_of(ptr,type,member)指由结构体中元素member和member在结构体中的地址找到结构体的首地址
#define offset_of(type,member) ((int)&(((type *)0)->member))

#define container_of(ptr,type,member) ({    \
    const typeof(((type*)0)->member) *__mptr = ptr;  \
    (type *)((char *)__mptr - offset_of(type,member)); \
    })

struct mytest{
    char i;
    int j;
    char *k;
    };
    
 int main(){
    struct mytest temp;
    struct mytest *p = &temp;
    p->i = 100;
    p->j = 10;
    
    printf("&temp = %p\n",&temp);   
    printf("&temp.k = %p\n",&temp.k);
    printf("&((struct mytest *)0)->k = %d\n",((int)&((struct mytest *)0)->k));
    printf("&temp = %p  \n",container_of(&temp.j,struct mytest,j));
    printf("&temp = %p  \n",container_of(&temp.k,struct mytest,k));
    printf("======test=====\n");
    printf("&temp = %p  \n", &p->i);
    printf("&temp = %p  \n", &(p->i));
    return 0;}

输出结果

&temp = 0x7ffee4018508 //结构体首地址
&temp.k = 0x7ffee4018510 // 结构体中元素k所在的地址,为了对齐字节,每个元素占4个字节
&((struct mytest *)0)->k = 8 //结构体中从首地址到k元素的长度
&temp = 0x7ffee4018508  //container_of(&temp.j,struct mytest,j)
&temp = 0x7ffee4018508  //container_of(&temp.k,struct mytest,k)
======test=====
&temp = 0x7ffee4018508  
&temp = 0x7ffee4018508  

还涉及一个运算符优先级的问题,顺手也做了小测试
&p->i

  • &和->的优先级高低问题
    通过上述测试,发现->优先级高于&
  • 高阶用法
  1. 对于uint16_t,uint32_t,uint64_t的使用,在程序中加入typedef unsigned __int16 uint16_t;typedef unsigned __int32 uint32_t;typedef unsigned __int64 uint64_t;的输入输出形式:
    https://blog.csdn.net/u010464679/article/details/45671705

malloc和free的使用
https://www.cxybb.com/article/weixin_43800761/107116376

参考
参考一
参考二
参考三
keyword
keepalived配置文件解析

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,544评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,430评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,764评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,193评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,216评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,182评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,063评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,917评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,329评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,543评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,722评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,425评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,019评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,671评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,825评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,729评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,614评论 2 353

推荐阅读更多精彩内容