您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > 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 语言   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
用 C 语言实现一个循环队列
本文将介绍如何使用C语言实现一个循环队列,包括队列的定义、入队、出队、判空和判满等操作。代码实现将遵循专业编程规范,并使用注释进行详细解释。一、引言队列是一种常见的...【详细内容】
2023-12-07  Search: C 语言  点击:(205)  评论:(0)  加入收藏
C 语言变长参数及其陷阱
C 工具变长参数列表这部分解释了旧的 C 风格变长参数列表。了解这些内容很重要,因为你可能会在遗留代码中遇到它们。然而,在新代码中,你应该使用变参模板来实现类型安全的变长...【详细内容】
2023-12-06  Search: C 语言  点击:(245)  评论:(0)  加入收藏
C 语言编译器(IDE)初学者指南:选择适合你的工具
一、前言在当今的软件开发世界中,C语言仍然是一种非常重要的编程语言,被广泛用于系统编程,游戏开发,嵌入式系统等领域。对于C语言的初学者来说,选择一款合适的编译器(IDE)是他们学...【详细内容】
2023-11-14  Search: C 语言  点击:(238)  评论:(0)  加入收藏
C 语言程序如何在计算机内部工作?
在计算机科学中,理解程序的内部工作原理是一项基础且重要的技能。本文将深入探讨C程序的内部工作方式,涉及的主题包括编译过程、执行过程和内存管理等。1.编译过程C程序的生命...【详细内容】
2023-09-28  Search: C 语言  点击:(352)  评论:(0)  加入收藏
C 语言编程的几个事半功倍的小技巧
在编程开发的过程中,存在一些常见的编程问题,存在一些优雅的解法。以下汇总以下几种常遇见的场景: 日志打印 打印变量名 获取数组大小 获取结构体成员偏移 依赖已有变量定义新...【详细内容】
2023-07-12  Search: C 语言  点击:(303)  评论:(0)  加入收藏
在 FreeDOS 上如何使用 C 语言编程
当我第一次开始使用 DOS 时,我喜欢 DOS 自带的 BASIC 来编写游戏和其它一些有趣的程序。很长时间后,我才学习 C 编程语言。我马上爱上了使用 C 语言做开发!它是一种简单易懂的...【详细内容】
2023-04-21  Search: C 语言  点击:(389)  评论:(0)  加入收藏
嵌入式开发:提示和技巧——C 语言中要避免的8个保留字
 仅仅因为一个特性是用他们选择的语言提供给程序员的,并不意味着他们应该使用它!在使用C开发嵌入式软件时尤其如此。虽然C为嵌入式开发人员提供了大量不可或缺的工具,但有8个...【详细内容】
2022-08-08  Search: C 语言  点击:(426)  评论:(0)  加入收藏
深入理解 C 语言的 hello world
引言在学习C语言或者其他编程语言的时候,我们编写的一个程序代码,基本都是在屏幕上打印出 hello world ,开始步入编程世(深)界(坑)的。C 语言版本的 hello world 代码:#include <std...【详细内容】
2021-12-21  Search: C 语言  点击:(417)  评论:(0)  加入收藏
C 语言简单编程速成
我们将所有的 C 语言要素放置到一份易读的备忘录上。&bull; 来源:linux.cn &bull; 作者:Seth Kenlon &bull; 译者:郑 &bull;(本文字数:5500,阅读时长大约:8 分钟)我们将所有的 C 语...【详细内容】
2020-10-18  Search: C 语言  点击:(355)  评论:(0)  加入收藏
C 语言和 C++、C# 的区别在什么地方?
C程序是一组函数和数据类型,就像一把锋利的随身匕首,非常灵活,在高手的手上可以幻化出各种招式,杀人于无形。C++程序是一组函数和类,像一门大炮,扛在肩上很重,炮弹打出去威力很大,但...【详细内容】
2019-12-20  Search: C 语言  点击:(552)  评论:(0)  加入收藏
▌简易百科推荐
C++常见避坑指南
C++ 从入门到放弃?本文主要总结了在C++开发或review过程中常见易出错点做了归纳总结,希望借此能增进大家对C++的了解,减少编程出错,提升工作效率,也可以作为C++开发的避坑攻略。...【详细内容】
2024-04-03  腾讯技术工程    Tags:C++   点击:(4)  评论:(0)  加入收藏
C++ 之父反驳白宫警告:自诞生第一天起,C++ 的目标就一直是提高安全性
整理 | 郑丽媛上个月,美国白宫国家网络主任办公室(ONCD)在一份主题为《回到基础构件:通往安全软件之路》的 19 页 PDF 报告中,呼吁开发人员停止使用容易出现内存安全漏洞的编程语...【详细内容】
2024-03-25    CSDN  Tags:C++   点击:(4)  评论:(0)  加入收藏
八个 C++ 开源项目,帮助初学者进阶成长
通过参与或阅读开源项目的源代码,你可以获得丰富的实践机会。实际的项目代码比简单的教程更具挑战性,可以帮助你深入理解 C++ 的各种概念和技术。1.ThreadPool一个简单的 C++1...【详细内容】
2024-03-22  AI让生活更美好  微信公众号  Tags:C++   点击:(21)  评论:(0)  加入收藏
C# 中15个值得收藏的开源项目推荐
在开源的世界里,C# 编程语言也占有一席之地。这些开源项目涵盖了多个领域,从框架、库到工具,它们为C#开发者提供了丰富的资源和工具,帮助他们更高效地开发、测试和部署应用程序...【详细内容】
2024-03-20  程序员编程日记  微信公众号  Tags:C#   点击:(30)  评论:(0)  加入收藏
C#异步编程:Task.Run vs. async-await,掌握基础与高级用法
概述:C#中的异步编程有两主要方式:Task.Run用于在后台线程执行同步操作,而async-await更适用于清晰表达异步流程。基础用法展示了它们的简单应用,高级用法则演示了它们的结合使...【详细内容】
2024-03-09  架构师老卢  今日头条  Tags:C#   点击:(23)  评论:(0)  加入收藏
C++多线程编程:解锁性能与并发的奥秘
今天我们将深入探讨C++中的多线程编程,揭示多线程如何解锁性能潜力,提高程序的并发性能。什么是多线程?在计算机科学中,多线程是指一个进程(程序的执行实例)中的多个线程同时执行...【详细内容】
2024-02-03     AI让生活更美好  Tags:C++   点击:(69)  评论:(0)  加入收藏
C++代码优化攻略
今天我们将深入探讨C++性能优化的世界。在当今软件开发的浪潮中,高性能的代码是必不可少的。无论是开发桌面应用、移动应用,还是嵌入式系统,性能都是关键。1. 选择合适的数据结...【详细内容】
2024-01-26  AI让生活更美好  微信公众号  Tags:C++   点击:(114)  评论:(0)  加入收藏
C# 线程本地存储为什么线程间值不一样
为什么用 ThreadStatic 标记的字段,只有第一个线程拿到了初始值,其他线程都是默认值,让我能不能帮他解答一下,尼玛,我也不是神仙什么都懂,既然问了,那我试着帮他解答一下,也给后面类...【详细内容】
2024-01-26  一线码农聊技术  微信公众号  Tags:C#   点击:(67)  评论:(0)  加入收藏
C++质数检测器的设计与实现​
质数,作为数学中的一个基本概念,一直以其独特的性质吸引着众多研究者和爱好者。质数是指大于1的自然数中,除了1和它本身以外不再有其他因数的数。在实际应用中,质数检测也扮演着...【详细内容】
2024-01-15  鲨鱼编程  微信公众号  Tags:C++   点击:(111)  评论:(0)  加入收藏
C# 登顶!超越Java或非空想
整理丨诺亚出品 | 51CTO技术栈(微信号:blog51cto)近日,TIOBE编程社区公布年度编程语言,此次摘得这一桂冠的是C#。这也是C#在TIOBE二十多年评选历史中首次赢得这一年度大奖。C#虽...【详细内容】
2024-01-15    51CTO  Tags:C#   点击:(114)  评论:(0)  加入收藏
站内最新
站内热门
站内头条