前言
今天遇到一道作业, 让我想了很久. 这道题真奇葩, 已经被老师玩哭了^_^
我作出来一个结果, 不知道合不合老师的心意~~
题目
4.用宏实现模板功能,分别输出
void main()
{
ADD(int)(1,2);
ADD(float)(1.0f,2.2f);
ADD(int)(10,20);
ADD(char*)("hello","wolrd");
}
测试工程
/// @file exam_x_x.cpp
/// @brief
/**
4.用宏实现模板功能,分别输出
void main()
{
ADD(int)(1,2);
ADD(float)(1.0f,2.2f);
ADD(int)(10,20);
ADD(char*)("hello","wolrd");
}
*/
#include <iostream>
#include <limits>
#include "MicroTemplate.h"
using namespace std;
void clear_cin();
void main()
{
ADD(int)(1,2);
ADD(float)(1.0f,2.2f);
ADD(int)(10,20);
ADD(char*)("hello","wolrd");
/** run result
ADD(int)(1,2) = 3
ADD(float)(1.0f,2.2f) = 3.2f
ADD(int)(10,20) = 30
ADD(char*)("hello","wolrd") = hellowolrd
*/
}
void clear_cin()
{
cin.clear();
cin.sync();
}
MicroTemplate.h
// MicroTemplate.h: interface for the MicroTemplate class.
//
//
#if !defined(AFX_MICROTEMPLATE_H__D9D78E4F_0EE0_4768_9BA0_4C872F462072__INCLUDED_)
#define AFX_MICROTEMPLATE_H__D9D78E4F_0EE0_4768_9BA0_4C872F462072__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#define ADD(x) fnAddAndPrint
inline int fnAddAndPrint(int x, int y)
{
int Rc = x + y;
printf("ADD(int)(%d,%d) = %d\r\n", x, y, Rc);
return Rc;
}
inline float fnAddAndPrint(float x, float y)
{
float Rc = x + y;
printf("ADD(float)(%.1ff,%.1ff) = %.1ff\r\n", x, y, Rc);
return Rc;
}
inline char* fnAddAndPrint(char* x, char* y)
{
static char s_szBuf[4096] = {'\0'};
if (NULL != x)
{
strcpy(s_szBuf, x);
}
if (NULL != y)
{
strcat(s_szBuf, y);
}
printf("ADD(char*)(\"%s\",\"%s\") = %s\n", x, y, s_szBuf);
return s_szBuf;
}
#endif // !defined(AFX_MICROTEMPLATE_H__D9D78E4F_0EE0_4768_9BA0_4C872F462072__INCLUDED_)
补充 - 2022_1021_2235
今天CSDN同学给了一个优质实现, 感谢!
// 这是 qq_45279840@csdn 提供的一个优质实现
// 他是在vscode下调试通过的
// 我本地有VS, 就用VS console工程来实验
// build on vs2022 console
// 编译0错误, 0警告
// 运行起来结果正确
// qq_45279840@csdn 的实现NB, 代码行数很少
#include <iostream>
using namespace std;
#define MAX(T) T ADD_##T(T x, T y) { return x + y; }
MAX(int);
MAX(float);
MAX(string);
#define ADD(T) ADD_##T
int main()
{
cout << ADD(int)(1, 2) << endl;
cout << ADD(float)(1.0f, 2.2f) << endl;
cout << ADD(int)(10, 20) << endl;
cout << ADD(string)("hello", "world") << endl;
/* run result
3
3.2
30
helloworld
*/
return EXIT_SUCCESS;
}
看看预编译结果
重新编译, 报错, 但是生成了.i
这就够了, 可以看.i中的预处理编译结果.
.i文件蛮大的, 用vscode打开后, 拉到最后
#pragma warning(pop)
#pragma pack(pop)
#line 75 "C:\\Program Files\\Microsoft Visual Studio\\2022\\Professional\\VC\\Tools\\MSVC\\14.33.31629\\include\\iostream"
#line 76 "C:\\Program Files\\Microsoft Visual Studio\\2022\\Professional\\VC\\Tools\\MSVC\\14.33.31629\\include\\iostream"
#pragma external_header(pop)
#line 12 "D:\\my_dev\\my_local_git_prj\\soft\\micro_template\\csdn_micro_template\\csdn_micro_template.cpp"
using namespace std;
int ADD_int(int x, int y) { return x + y; };
float ADD_float(float x, float y) { return x + y; };
string ADD_string(string x, string y) { return x + y; };
int main()
{
cout << ADD_int(1, 2) << endl;
cout << ADD_float(1.0f, 2.2f) << endl;
cout << ADD_int(10, 20) << endl;
cout << ADD_string("hello", "world") << endl;
return 0;
}
qq_45279840@csdn同学的思路很优秀, 学到很多.
另外说一下, 大家讨论问题时, 不要气氛那么火爆.
工程师一起讨论问题, 难免有点误会, 毕竟大家不是面对面的同事.
先发言的人, 如果因为一些误会, 先莫名其妙的火爆起来, 另外一个人不火爆也不行啊.
我真没见过几个技术NB, 脾气还好的人.
见过几个, 但是人家不是大学的博士, 就是领域内的专家, 人家根本不会在这些技术枝节问题的讨论上带任何情绪.
不过, 大家都是就事论事, 都是路人, 也没仇没怨的. 将误会说明, 消除误会就好了.
也许每次讨论问题, 都是我们这辈子最后一次讨论问题.
不管因为什么样的原因, 大家能在一起讨论问题, 也算是一种缘分, 孽缘也是缘分的一种.
我的讨论问题习惯:
* 如果你要讨论问题, 留了言. 我看到之后, 觉得需要讨论, 就会讨论并留言. 但是你在1天之内没有回复我的讨论留言, 那么我就认为这个问题已经讨论完了, 不存在玩不起的问题. 技术上的事情都是微不足道的小事情, 不存在面子的问题. 讨论完, 大家都有提高.
* 讨论完问题, 如果有价值, 会做个笔记.
* 保留讨论的留言1天, 如果在这1天内, 没有新的讨论出现, 那说明大家不需要再讨论了, 那就将讨论的留言删除. 留言本身没有保存的价值. 价值已经在大家的讨论交互过程中实现了, 大家都已经得到了提高.
为啥说留言本身没有保存的价值呢? 如果在网上写技术笔记的同学就有体会.
e.g. 有人要讨论问题, 留言了, 你回了一个讨论留言. 然后这个人就消失了. 那这种留言, 摆在哪里有什么价值呢?
e.g. 我看见有同学要讨论问题, 我回了留言, 这个人就消失了, 那我1天之后,将这个没有任何意义的留言删了. 又过了3天, 这个同学又来继续讨论此前的问题, 指责我将他留言删了, 玩不起. WoKao, 你有没有想过, 你为啥没有及时回复别人给你的留言呢?
e.g. 有人留言了, 但是我无法理解. 那就让留言留1天, 删掉就好.
e.g. 如果大家讨论有成果, 这个成果会作为笔记补充. 留言本身也没有任何意义.
总之, 大家讨论问题是有益的, 可以共同进步, 共同提高. 双赢啊.