您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > C/C++/C#

C 语言编程的几个事半功倍的小技巧

时间:2023-07-12 20:30:49  来源:今日头条  作者:编程黑科技

编程开发的过程中,存在一些常见的编程问题,存在一些优雅的解法。

以下汇总以下几种常遇见的场景:

  • 日志打印
  • 打印变量名
  • 获取数组大小
  • 获取结构体成员偏移
  • 依赖已有变量定义新变量
  • 获取较小值
  • 计算函数参数个数
  • .....(不定时新增)
// 文件名 tricks.c

#include <stdio.h>
#include <stdlib.h>

// 日志打印
#define LOG(level, format, ...) printf("[%s] <%s> (%s:%d) " format "n", #level, __FUNCTION__, __FILE__, __LINE__, ##__VA_ARGS__)
#define LOGD(...) LOG(DEBUG, __VA_ARGS__)
#define LOGI(...) LOG(INFO, __VA_ARGS__)
#define LOGW(...) LOG(WARNING, __VA_ARGS__)
#define LOGE(...) LOG(ERROR, __VA_ARGS__)
#define LOGF(...) LOG(FATAL, __VA_ARGS__); abort()

// 打印变量名
#define PRINT_HEX(var) printf("%s: 0x%08xn", #var, var);

// 获取数组大小
#define ARRAR_SIZE(arr) (sizeof(arr) / sizeof(*arr))

// 获取结构体成员偏移
#define offsetof(type, member) ((size_t)(&((type *)0)->member))

// 依赖已有变量定义新变量
#define var(left, right) __typeof__(right) left = (right)

// 获取较小值
#define MIN(A,B) ({ __typeof__(A) __a = (A); __typeof__(B) __b = (B); __a < __b ? __a : __b; })

// 该方式计算函数参数个数,可能会有 -Wint-conversion 告警
#define ARG_SIZE(...) (sizeof((int[]){0, ##__VA_ARGS__}) / sizeof(int) - 1)

// 该方式计算函数参数个数,会有一个最大数限制,以下的版本是最多 64 个参数
#define ARG_N(...) ARG_N_(0, ##__VA_ARGS__, ARG_N_RESQ)

#define ARG_N_(...) ARG_N_M(__VA_ARGS__)

#define ARG_N_M(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10,      
                _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, 
                _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, 
                _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, 
                _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, 
                _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, 
                _61, _62, _63, N, ...) N

#define ARG_N_RESQ 63, 62, 61, 60,                         
                   59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 
                   49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 
                   39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 
                   29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 
                   19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 
                   9, 8, 7, 6, 5, 4, 3, 2, 1, 0

int mAIn(int argc, char const *argv[])
{
    LOGD("Test log var: %d", 1234);

    int flag = 0xaabbccdd;
    PRINT_HEX(flag);

    int array[5] = {1, 2, 3, 4, 5};
    LOGI("ARRAR_SIZE(array): %lu", ARRAR_SIZE(array));

    typedef struct
    {
        int a;
    } A;
    A a = {15};
    var(b, a); 
    PRINT_HEX(b.a);
    var(s, 1); 
    PRINT_HEX(s);

    double xx = 1.0;
    double yy = MIN(xx++, 1.5);
    printf("xx=%f, yy=%fn", xx, yy);

    typedef struct S
    {
        char a;
        int b;
        double c;
    } S;
    LOGI("offsetof(S, c): %ld", offsetof(S, c));

    LOGI("ARG_SIZE(...): %ld", ARG_SIZE(1, 2, 3, 4));
  
    LOGI("ARG_N(...): %d", ARG_N(1, 2, 3, 4));
  
    return 0;
}

编译及运行指令:

gcc tricks.c -o tricks -g && ./tricks


Tags:C 语言   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除。
▌相关推荐
在编程开发的过程中,存在一些常见的编程问题,存在一些优雅的解法。以下汇总以下几种常遇见的场景: 日志打印 打印变量名 获取数组大小 获取结构体成员偏移 依赖已有变量定义新...【详细内容】
2023-07-12  Tags: C 语言  点击:(0)  评论:(0)  加入收藏
当我第一次开始使用 DOS 时,我喜欢 DOS 自带的 BASIC 来编写游戏和其它一些有趣的程序。很长时间后,我才学习 C 编程语言。我马上爱上了使用 C 语言做开发!它是一种简单易懂的...【详细内容】
2023-04-21  Tags: C 语言  点击:(143)  评论:(0)  加入收藏
 仅仅因为一个特性是用他们选择的语言提供给程序员的,并不意味着他们应该使用它!在使用C开发嵌入式软件时尤其如此。虽然C为嵌入式开发人员提供了大量不可或缺的工具,但有8个...【详细内容】
2022-08-08  Tags: C 语言  点击:(209)  评论:(0)  加入收藏
引言在学习C语言或者其他编程语言的时候,我们编写的一个程序代码,基本都是在屏幕上打印出 hello world ,开始步入编程世(深)界(坑)的。C 语言版本的 hello world 代码:#include <std...【详细内容】
2021-12-21  Tags: C 语言  点击:(265)  评论:(0)  加入收藏
我们将所有的 C 语言要素放置到一份易读的备忘录上。&bull; 来源:linux.cn &bull; 作者:Seth Kenlon &bull; 译者:郑 &bull;(本文字数:5500,阅读时长大约:8 分钟)我们将所有的 C 语...【详细内容】
2020-10-18  Tags: C 语言  点击:(236)  评论:(0)  加入收藏
C程序是一组函数和数据类型,就像一把锋利的随身匕首,非常灵活,在高手的手上可以幻化出各种招式,杀人于无形。C++程序是一组函数和类,像一门大炮,扛在肩上很重,炮弹打出去威力很大,但...【详细内容】
2019-12-20  Tags: C 语言  点击:(383)  评论:(0)  加入收藏
数据结构是什么?要了解数据结构,我们要先明白数据和结构,数据就是一些int char 这样的变量,这些就是数据,如果你是一个篮球爱好者,那么你的球鞋就是你的数据,结构就是怎么把这些数据排列组合,怎么把数据摆放好才能方便你找到...【详细内容】
2019-11-04  Tags: C 语言  点击:(351)  评论:(0)  加入收藏
TBOX 是一个用 C 语言实现的跨平台开发库。针对各个平台,封装了统一的接口,简化了各类开发过程中常用操作,使你在开发过程中,更加关注实际应用的开发,而不是把时间浪费在琐碎的接...【详细内容】
2019-10-12  Tags: C 语言  点击:(428)  评论:(0)  加入收藏
▌简易百科推荐
作为一名程序员,2023年最应该关注的话题就是C++的标准更新。C++标准遵循3年开发周期,并以发布年份命名。C++在临发布的一年前会进入“功能冻结期(feature freeze)”,即版本开发进...【详细内容】
2023-07-24    51CTO  Tags:C++   点击:(5)  评论:(0)  加入收藏
在编程开发的过程中,存在一些常见的编程问题,存在一些优雅的解法。以下汇总以下几种常遇见的场景: 日志打印 打印变量名 获取数组大小 获取结构体成员偏移 依赖已有变量定义新...【详细内容】
2023-07-12  编程黑科技  今日头条  Tags:C 语言   点击:(0)  评论:(0)  加入收藏
阿里妹导读作者在调查某个 bug 时涉及到 C++ 异常,借此机会以本文把 C++ 异常机制梳理清楚供大家参考。最近我们在调查某个 bug 涉及到 C++ 异常。平时较少用 C++ 异常,借此机...【详细内容】
2023-07-11     阿里技术  Tags:C+   点击:(36)  评论:(0)  加入收藏
整理 | 郑丽媛出品 | CSDN(ID:CSDNnews)一月一度的 TIOBE 榜单又发布了,快来看看 7 月的编程语言排行榜有什么最新变化吧!C++ 正在向 C 发起“进攻”!自从去年 12 月 C++ 在 TIOBE...【详细内容】
2023-07-10    CSDN  Tags:C++   点击:(24)  评论:(0)  加入收藏
人脸识别库ViewFaceCore 是一个使用 C# 开发的超简单的离线人脸识别库。( 基于 SeetaFace6 ),多平台支持, 开源、免费、跨平台 (win/linux)。支持的.NET 版本, .NET Framework...【详细内容】
2023-07-03  攻城大狮哥    Tags:C#   点击:(29)  评论:(0)  加入收藏
大家好,我是华山自控编程朱老师前几天一个学员在学习C#与TryCatch用法时,也不知道TryCatch用法装可以用来做什么 。下面我们就详细讲讲C# 和封TryCatch用法相关知识。C# 是一...【详细内容】
2023-07-02  华山自控编程    Tags:C#   点击:(29)  评论:(0)  加入收藏
前面写了一篇用C语言实现一个万能单向链表,后来我想了下。在工作开发中,貌似用到队列这种机制的情况更常见。所以,本次用C语言写一个万能的队列。简单介绍下,队列是一种严格的线...【详细内容】
2023-06-27  记录我的编程生活  今日头条  Tags:C语言   点击:(36)  评论:(0)  加入收藏
作者 | Joydip Kanjilal编译 | 王瑞平意大利面是一种很好吃的食物,但是,如果用它来形容代码意味着这种程序很糟糕。“意大利面条式代码”是一个术语,用于描述组织不良、纠缠不...【详细内容】
2023-06-21    51CTO  Tags:C#   点击:(46)  评论:(0)  加入收藏
在使用任何语言编写程序时,您需要使用各种变量来存储各种信息。变量只是保留内存位置来存储值。 这意味着当你创建一个变量时,你在内存中保留一些空间。您可能喜欢存储各种数...【详细内容】
2023-06-14  原在路上路途阳光    Tags:c++   点击:(65)  评论:(0)  加入收藏
判断字符串为空有好几种方法:方法一: 代码如下:static void Main(string[] args) { string str = ""; if (str == "") { Console.WriteLine("a is empty"); ; } Console.ReadKe...【详细内容】
2023-06-13  opendotnet    Tags:C#   点击:(62)  评论:(0)  加入收藏
站内最新
站内热门
站内头条