C — 小知识
老是记错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 — 小知识的更多相关文章
- 蓝牙Bluetooth技术小知识
蓝牙Bluetooth技术以及广泛的应用于各种设备,并将继续在物联网IoT领域担任重要角色.下面搜集整理了一些关于蓝牙技术的小知识,以备参考. 蓝牙Bluetooth技术始创于1994年,其名字来源于 ...
- HTML+CSS中的一些小知识
今天分享一些HTML.CSS的小知识,希望能够对大家有所帮助! 1.解决网页乱码的问题:最重要的是要保证各个环节的字符编码一致! (1)编辑器的编辑环境的字符集(默认字符集):Crtl+U 常见的编码 ...
- iOS APP开发的小知识(分享)
亿合科技小编发现从2007年第一款智能手机横空出世,由此开启了人们的移动智能时代.我们从一开始对APP的陌生,到现在的爱不释手,可见APP开发的出现对我们的生活改变有多巨大.而iOS AP ...
- Unix系统小知识(转)
Unix操作系统的小知识 2.VI添加行号/翻页/清屏 .在对话模式时(即输完Esc再输入: ),输入“:set number”可以将编辑的文本加上行号.跟玩俄罗斯方块一样方便的上下左右移动箭头的快捷 ...
- salesforce 零基础开发入门学习(十)IDE便捷小知识
在这里介绍两个IDE的便捷开发的小知识. 一) 本地调试 由于salesforce代码只能提交以后才能调试,所以很多时候调试代码很麻烦.新版增加了一个特性:即可以在本地调试相关的代码或者查看相关代码运 ...
- Jquery:小知识;
Jquery:小知识: jQuery学习笔记(二):this相关问题及选择器 上一节的遗留问题,关于this的相关问题,先来解决一下. this的相关问题 this指代的是什么 这个应该是比较好理 ...
- HTML小知识---Label
今天知道了一个html小知识: <input type="checkbox" id="chkVersion" /> ...
- Unicode和汉字编码小知识
Unicode和汉字编码小知识 将汉字进行UNICODE编码,如:“王”编码后就成了“\王”,UNICODE字符以\u开始,后面有4个数字或者字母,所有字符都是16进制的数字,每两位表示的256以内的 ...
- Java异常的一个小知识
有以下两个代码: package com.lk.A; public class Test3 { public static void main(String[] args) { try { int a ...
- 12个你未必知道的CSS小知识
虽然CSS并不是一种很复杂的技术,但就算你是一个使用CSS多年的高手,仍然会有很多CSS用法/属性/属性值你从来没使用过,甚至从来没听说过. 1.CSS的color属性并非只能用于文本显示 对于CSS ...
随机推荐
- 如何获取object数据的描述符
const data = { portLand: '78/50', Dublin: '88/52', Lima: '58/40' } Object.defineProperty(data, 'Lima ...
- 安装ipython[win/linux]
首先以win7 64位系统, python2.7.9为例,linux见底部 1.下载材料http://files.cnblogs.com/files/smileyes/ipython-win64.z ...
- dw 快捷键
<html></html> 创建一个HTML文档<head></head> 设置文档标题和其它在网页中不显示的信息<title></t ...
- c语言getipaddrtable获得ip地址与sendArp获得mac地址以及一些字节序问题记录
https://docs.microsoft.com/zh-cn/windows/win32/api/iphlpapi/nf-iphlpapi-getipaddrtable msdn,有很多c的源码还 ...
- PHP导出身份证号科学计数法
最近在做PHP的数据导入和导出,到处身份证号的时候,直接变成了科学计算法,找了一个很简单的方法就是这样 $obj= " ".$v['idcard']; 但是这样有空格啊,网上搜了一 ...
- 吴裕雄 python 机器学习——超大规模数据集降维IncrementalPCA模型
# -*- coding: utf-8 -*- import numpy as np import matplotlib.pyplot as plt from sklearn import datas ...
- Java - JVM - 类的生命周期
概述 简述 JVM 里 类的生命周期 上次写了 30%, 居然丢了 难受, 又要重新写 类的生命周期 加载 使用 卸载 1. 加载 概述 类型的加载 大体流程 装载 连接 验证 准备 解析(可选的) ...
- Go_ioutil包
1. ioutil包的方法 // Discard 是一个 io.Writer 接口,调用它的 Write 方法将不做任何事情 // 并且始终成功返回. var Discard io.Writer = ...
- 【C语言】(指针) 将两个数排序
原理就不讲了,这里用来理解指针的使用方法 代码1: #include <stdio.h> int main() { int a, b;/* 实际变量的声明 */ int* p, * q;/ ...
- 每天进步一点点------H.264学习 (一)
分三个阶段学习1.第一个阶段: 学习H.264,首先要把最基本最必要的资料拿在手里.这些资料包括:标准文档+测试模型+经典文章,在本FTP中能找到.首先看 <H.264_MPEG-4 Part ...