程序分身:根据不同程序名执行不同函数

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://latelee.blog.csdn.net/article/details/81212751

layout: post
title:
keywords:
category: C++学习
tags : [notes]

背景

最近在看某开源项目源码,发现代码里对main函数的参数做了处理,根据传入的程序名称(即argv[0]),调用不同的函数。笔者认为这个小技巧挺不错的,本文就整理实践一下。

完整源码

main.c源码如下:

/**
作用:
只有可执行程序文件名是foo或bar时才能正常执行,其它任何字符串都不行。

作用:
如有服务端、客户端的小程序,可在一个文件中实现,编译,然后改名,根据可执行文件不同,调用不同函数,达到“多程序”目的。
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int foo_1(int argc, char* argv[])
{
    printf("hello foo.\n");
}

int bar_1(int argc, char* argv[])
{
    printf("hello bar.\n");
}

#define	CMD_FOO	"foo"
#define CMD_BAR	"bar"

int main(int argc, char *argv[])
{
	char* p;
	char* cmdname = *argv;

	if ((p = strrchr (cmdname, '/')) != NULL) {
		cmdname = p + 1;
	}

	if (strcmp(cmdname, CMD_FOO) == 0) {

		if (foo_1 (argc, argv) != 0)
			return -1;

		return 0;

	} else if (strcmp(cmdname, CMD_BAR) == 0) {

		if (bar_1 (argc, argv) != 0)
			return -1;

		return 0;

	}

	fprintf (stderr,
		"Identity crisis - may be called as `" CMD_FOO
		"' or as `" CMD_BAR "' but not as `%s'\n",
		cmdname);
	return -1;
}

编译

gcc main.c

执行:

$ ./a.out 
Identity crisis - may be called as `foo' or as `bar' but not as `a.out'
$ cp a.out foo
$ cp a.out bar
$ ./foo 
hello foo.
$ ./bar 
hello bar.

实践应用、小结

在socket测试中,有客户端、服务端代码,可分别在不同文件中实现,但只有一个入口main函数,只用一个Makefile,在Makefile中将生成的可执行文件改名为client、server,然后就得到2个程序了。这样就不需要维护2个Makefile,编译2次了。从效率上看,还是可以试试。

本文所述的,只是小技巧,对于大型项目来说,不能这样做。但其思想,还是值得我们学习的。

李迟 2018.7.25 凌晨

展开阅读全文

根据不同的命令按钮被单击执行不同的存储过程

05-31

运用实例和场景:rnexcel中的用户窗体,根据窗体中输入的共用参数,提供n个不同的命令按钮,所有这些命令按钮都调用不同的存储过程,但这些存储均携带参数,而这些参数都来源于窗体中的共用参数。rn要求是当命令1按钮被单击执行时,调用的连接mysql=存储过程1rn当命令2按钮被单击执行时,调用的连接mysql=存储过程2rn当命令3按钮被单击执行时,调用的连接mysql=存储过程3rn依此类推。rnrn代码区中,如何准确判断各个命令按钮是否被单击,以及单击后执行mysql的连接并将结果返回呢?rnrn代码:rn[code=VB][/code]rnFunction 提取合同数据查询(ByVal tbdydm, ByVal tbordernum, ByVal tbconnum, ByVal tbcustname, ByVal dtkssj, ByVal dtjssj) As Booleanrn 提取合同数据查询 = Truern Dim mycn As New ADODB.Connectionrn Dim myrst As New ADODB.Recordsetrn Dim cwR, cwC, cwF, cwi, ii As Integerrn Dim mysqlrn mycn.CursorLocation = adUseClientrn mycn.Open Sheets("sys").Range("B43") '连接数据库rn rn mysql = "" '定义查询rn If cmdrzymatching = 1 Thenrn mysql = "exec fsrzymatching '" & tbdydm & "','" & tbconnum & "','" & dtkssj & "','" & dtjssj & "'"rn End Ifrn rn rn 'MsgBox mysqlrn rn myrst.Open mysql, mycn, adOpenStatic, adLockBatchOptimistic '执行查询rn rn Sheets("xtmp").Visible = Truern Sheets("xtmp").Activatern Cells.Selectrn Selection.Delete Shift:=xlUprn rn rn cwR = 2rn cwC = 1 'Excel中目的区域的起始列号rn cwi = 0 'SQL-fskucun-fsxall 中的字段序号rn cwF = myrst.Fields.Count - 1 '查询返回的记录的字段数rn rn ii = myrst.Fields.Countrn For i = 1 To iirn Sheets("xtmp").Cells(1, i) = myrst.Fields(i - 1).Namern Next irn rn While Not myrst.EOFrn For cwi = 0 To cwFrn Sheets("xtmp").Cells(cwR, cwi + cwC).Rows.Value = myrst.Fields(cwi).Valuern Next cwirn cwR = cwR + 1rn myrst.MoveNextrn Wendrnrn myrst.Close '关闭结果集rn mycn.Close '关闭连接rn Set mycn = Nothingrn rn Sheets("xtmp").Cells.EntireColumn.AutoFitrn rnEnd Functionrnrn[code=VB][/code]rn 论坛

asp根据不同条件生成不同报表

04-23

下面是我做的页面,form没加.因为还没确定加在哪里.rn我想要的效果是:根据前8行的条件,先搜索出不同的结果来.这个我会做,用一个searchmodel然后循环控制一下.下面的"资料导入","booking","查询编辑",三个按钮也和这个页面的条件没关系,是跳到其他页面去的.rn重点是"导出报表"按钮,按下后会显示要生的报表,有7个.选择不同的报表,还要结合上面不同的条件,再生成页面.这个就不知道做了.是把7个报表做在一个页面里,然后用条件来判断再显示,还是做7个不同的报表页面呢?做在一个里好象代码太多了,起码超过3000行了.rn到底要怎么做呢?rn还有些控制条件,就是有的报表不准选某些条件,要怎么控制?rn请给点思路,比如form直接把table全部框住,每个input的值怎么传递,导出的页面怎么搞==,根据各位的意见详细度给分.谢谢.rn[code=HTML]rn<%@ LANGUAGE = VBScript.Encode %>rnrnrn rn rn PMS rn rn rn rn rn rn rn rn rn 报 表 系 统 rn rn rn rn 供应商rn rn rn 全部rn 供应商1rn 供应商2rn 供应商3rn 供应商4rn 供应商5rn rn rn rn 派工日期rn rn 年rn rn rn 结案日期rn 起rn ">rn 终rn rn rn rn 等级rn rn A等级 rn rn B等级 rn rn C等级 rn rn D等级 rn rn rn 结案rn rn 全部 rn rn Yesrn rn Norn rn rn 作业性质rn rn 全部 rn rnASSY B rn rn ASSY B+FT rn rn rn rn rn 发生异常rn 否 rn rn rn rn rn rn 全部 rn rn Yes rn rn No rn rn rn rn rn rn rn low yield rn 否 rn rn rn rn rn rn 全部 rn rn 封装 rn rn 测试 rn rn rn rn rn rn rn rn rn rn rn 产线一rn 产线二rn rn rn rn rn 月报1rn rn rn 月报2rn rn rn rn rn 周报3rn rn rn 周报4rn rn rn rn rn 月报5rn rn rn 月报6rn rn rn rn rn 分析表7rn rn rn rn rn rn rnrn rn rnrnrnrn[/code] 论坛

没有更多推荐了,返回首页