老是记错int与void*之间的转换,所以记录一个,顺便用一下一些宏、预处理。。。

  int与void*的转换、打印变量名:

#include <stdio.h>
// 打印变量名
#define VNAME(name) (#name) typedef void*(*func)(void*); void call(func myfunc, void*var)
{
(*myfunc)(var);
} void*myfunc(void*var)
{
printf("变量%s=%d\n", VNAME(var), *(int*)var);
} int main(int argc, char** argv)
{
int i = 0; call(myfunc, (void*)&i);
return 0;
}

  还可以这样调用回调函数:

#include <stdio.h>

static void*(*func)(void*); // or no static, but can not is 'extern'

void*myfunc(void*var)
{
printf("Output:%d\n", *(int*)var);
} int main(int argc, char** argv)
{
int n = 5;
func = myfunc((void*)&n);
return 0;
}

  跨编译器的一些宏与预处理方式(在RapidJson看到的):

...
#ifndef RAPIDJSON_UNLIKELY
#if defined(__GNUC__) || defined(__clang__)
#define RAPIDJSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
#else
#define RAPIDJSON_UNLIKELY(x) (x)
#endif
#endif
...

  C/C++的预处理:

#ifdefined(__cplusplus) || defined(c_plusplus)
extern "C"{
#endif
// ...
#ifdefined(__cplusplus) || defined(c_plusplus)
}
#endif

  跨平台的预处理(参考):

#if defined(WIN32) && !defined(UNIX)
/* Do windows stuff */
#elif defined(UNIX) && !defined(WIN32)
/* Do linux stuff */
#else
/* Error, both can't be defined or undefined same time */
#endif

  可变长参数(参考该文章):

#include <stdio.h>
#include <stdarg.h> /* __VA_ARGS__ */ #define DISPLAY(params, ...) printf(params, __VA_ARGS__) // c99 int main(int argc, char** argv)
{
int start = 0;
int end = 100; DISPLAY("%d - %d\n", start, end);
return 0;
}

  __VA__ARGS__只能用宏展开的方式使用,想要自己实现一个可变长参数的方法可以这样(参考《Linux网络编程》第十四章):

#include <stdio.h>
#include <stdarg.h> /* *va* */ #define DISPLAY(params, ...) printf(params, __VA_ARGS__) int print(const char*sp, ...)
{
char*buf;
va_list args; va_start(args, sp);
int args_nums = vsprintf(buf, sp, args);
va_end(args); puts(buf); return args_nums;
} int main(int argc, char** argv)
{
int start = 5, end = 10; printf("%s:%s\n", __FILE__, argv[0]); DISPLAY("In %s:%d:\n%d,%d\n", __func__, __LINE__, start, end);
print("In %s:%d:\n%d,%d\n", __func__, __LINE__, start, end);
return 0;
}

  Output:

test.c:./test
In main:39:
5,10
In main:41:
5,10

  其他参考:

    1.打印变量名:https://blog.csdn.net/sfwork/article/details/7866463

    2.一些宏的巧用:https://www.zhihu.com/question/40325914?sort=created

    3.http://bbs.chinaunix.net/thread-1293908-1-1.html

    4.https://blog.csdn.net/u012252959/article/details/53761360

    5.预处理:https://docs.microsoft.com/zh-cn/cpp/preprocessor/hash-if-hash-elif-hash-else-and-hash-endif-directives-c-cpp

C — 小知识的更多相关文章

  1. 蓝牙Bluetooth技术小知识

    蓝牙Bluetooth技术以及广泛的应用于各种设备,并将继续在物联网IoT领域担任重要角色.下面搜集整理了一些关于蓝牙技术的小知识,以备参考. 蓝牙Bluetooth技术始创于1994年,其名字来源于 ...

  2. HTML+CSS中的一些小知识

    今天分享一些HTML.CSS的小知识,希望能够对大家有所帮助! 1.解决网页乱码的问题:最重要的是要保证各个环节的字符编码一致! (1)编辑器的编辑环境的字符集(默认字符集):Crtl+U 常见的编码 ...

  3. iOS APP开发的小知识(分享)

          亿合科技小编发现从2007年第一款智能手机横空出世,由此开启了人们的移动智能时代.我们从一开始对APP的陌生,到现在的爱不释手,可见APP开发的出现对我们的生活改变有多巨大.而iOS AP ...

  4. Unix系统小知识(转)

    Unix操作系统的小知识 2.VI添加行号/翻页/清屏 .在对话模式时(即输完Esc再输入: ),输入“:set number”可以将编辑的文本加上行号.跟玩俄罗斯方块一样方便的上下左右移动箭头的快捷 ...

  5. salesforce 零基础开发入门学习(十)IDE便捷小知识

    在这里介绍两个IDE的便捷开发的小知识. 一) 本地调试 由于salesforce代码只能提交以后才能调试,所以很多时候调试代码很麻烦.新版增加了一个特性:即可以在本地调试相关的代码或者查看相关代码运 ...

  6. Jquery:小知识;

    Jquery:小知识: jQuery学习笔记(二):this相关问题及选择器   上一节的遗留问题,关于this的相关问题,先来解决一下. this的相关问题 this指代的是什么 这个应该是比较好理 ...

  7. HTML小知识---Label

    今天知道了一个html小知识: <input type="checkbox" id="chkVersion" />                 ...

  8. Unicode和汉字编码小知识

    Unicode和汉字编码小知识 将汉字进行UNICODE编码,如:“王”编码后就成了“\王”,UNICODE字符以\u开始,后面有4个数字或者字母,所有字符都是16进制的数字,每两位表示的256以内的 ...

  9. Java异常的一个小知识

    有以下两个代码: package com.lk.A; public class Test3 { public static void main(String[] args) { try { int a ...

  10. 12个你未必知道的CSS小知识

    虽然CSS并不是一种很复杂的技术,但就算你是一个使用CSS多年的高手,仍然会有很多CSS用法/属性/属性值你从来没使用过,甚至从来没听说过. 1.CSS的color属性并非只能用于文本显示 对于CSS ...

随机推荐

  1. 用synchronized实现互斥锁

    package seday10;/** * @author xingsir * 互斥锁 * 当使用synchronized锁定多个代码片段,并且他们指定的同步监视器对象是同一个时,那么这些代码片段之间 ...

  2. Python - 标准库部分函数、类的大致实现(持续更新)

    all() def all(iterable): for element in iterbale: if not element: return False return True any() def ...

  3. C#中对虚拟属性和抽象属性的重写有什么异同

           public abstract class A         {             //抽象属性不能有实现代码             public abstract strin ...

  4. drf三大组件之认证组件与权限组件

    复习 """ 视图家族 1.视图类:APIView.GenericAPIView APIView:作为drf的基础view:as_view()禁用csrf:dispatc ...

  5. Chrome - 使用 开发者工具 对页面截图

    概述 使用 开发者工具 对页面截图 背景 经常需要截图 常用的截图模式有这些 窗口截图 区域截图 gif 问题 Chrome 如何截长图 firefox 好像有插件 1. 解决: 使用 Chrome ...

  6. Git - 04. git 缓存

    1. 概述 简单描述, 已经被 暂存 过的文件的 操作 和 生命周期 在 缓存区 中的声明周期 暂时只与 缓存区 做交互 2. 文件生命周期 略 这个之前讲过 3. 命令 1. stage 文件 概述 ...

  7. 每天进步一点点------FPGA 静态时序分析模型——reg2reg

    2. 应用背景 静态时序分析简称STA,它是一种穷尽的分析方法,它按照同步电路设计的要求,根据电路网表的拓扑结构,计算并检查电路中每一个DFF(触发器)的建立和保持时间以及其他基于路径的时延要求是否满 ...

  8. MyBatis-Spring整合之方式1

    导入相关包:Spring包:Spring架包 MyBatis包:MyBatis架包 整合包:Mybatis-Spring整合包 编写实体类User,实体类的sql映射文件,映射内容如下: <?x ...

  9. C#面向对象三大特性:封装

    什么是封装 定义:把一个或多个项目封闭在一个物理的或者逻辑的包中.在面向对象程序设计方法论中,封装是为了防止对实现细节的访问. 封装的优点 1. 隔离性,安全性.被封装后的对象(这里的对象是泛指代码的 ...

  10. 6_3 矩阵链乘(UVa424)<用栈实现简单的表达式解析>

    假设你必须做A*B*C*D*E的运算,在这里A,B,C,D,E都是矩阵(matrix).由于矩阵相乘具有连接性(associative),所以相乘的顺序可以是任意的.然而所需要的基本乘法数却与不尽相同 ...