我在包含的文件中构建一组函数,我希望能够运行我的测试main()来调用在命令行上传递的函数名。像这样:
void rotate (int degrees) {
/*...*/
}
void translate (int pixels) {
/*...*/
}
int main(int argc, char* argv[] ) {
const int degs = 100;
const int pix = 250;
string func = argv[1];
//call func(degs) or func(pix) based on the command line argument passed
}
我希望能够从命令行运行% a.out translate
。使这项工作的语法是什么。提前谢谢,我在这个问题上找了一会儿,找不到任何东西。
答案 0 :(得分:6)
无法在C或C ++中执行此操作,因为函数"的名称消失了"当你编译代码。
解决此问题的常用方法是使用std::map<std::string, FunctionPtr>
或其他形式的表,其中包含字符串和函数指针之间的转换。
当然,一个非常粗糙的版本就是:
if (argv[1] == std::string("translate"))
{
int x = atoi(argv[2]);
translate(x);
}
(您需要转换为std::string
,或者您需要使用strcmp
,因为在==
和字符串文字之间使用char *
只会比较地址字符串,argv
在任何合理的情况下都不包含字符串文字的地址。)
std::map
中的函数指针可能是这样的
typedef void (*FuncType)(int v);
std::map<std::string, FuncType> m;
m["translate"] = translate;
m["rotate"] = rotate;
// Convert argv[2] to integer:
int x = argv[2];
// Call function indicated by argv[1]:
m[argv[1]](x);
答案 1 :(得分:3)
根据您的要求,这里有一个示例,说明如何使用std :: map来实现您想要的效果。为简单起见,我使用void函数和void参数。在您的情况下,您必须对地图使用void(*)(int)才能使用您的函数,因为它们将整数作为参数。您还必须找到如何自己传递int。您可以通过成对获取argv参数来完成此操作。
#include <iostream>
#include <map>
#include <string>
void func1() {
std::cout << "func1" << std::endl;
}
void func2() {
std::cout << "func2" << std::endl;
}
void func3() {
std::cout << "func3" << std::endl;
}
std::map<std::string,void (*)(void)> tmap = {
{"func1",&func1},
{"func2",&func2},
{"func3",&func3}
};
int main(int argc, char* argv[]) {
if (argc > 1) {
for (int i =1; i != argc; ++i) {
if (tmap.find(argv[i]) != tmap.end()) {
tmap[argv[i]]();
}
else {
std::cout << "There is no " << argv[i] << " function available." << std::endl;
}
}
}
else {
std::cout << "No functions were choosen." << std::endl;
}
return 0;
}
答案 2 :(得分:2)
按照要求......
#include <iostream>
#include <string>
#include <map>
typedef void FUNC(int);
FUNC rotate, translate;
int main(int argc, char *argv[])
{
std::map<std::string, FUNC *> m;
m["rotate"] = rotate;
m["translate"] = translate;
if ( argc > 1 )
{
FUNC *ptr = m[argv[1]];
if ( ptr )
ptr(100);
}
}
在C ++ 11中,您可以为m
使用大括号括起的初始值设定项。
如果重复困扰你,你甚至可以去:
#define M_ROW(funcname) m[#funcname] = funcname