使用命令行输入来调用函数

时间:2014-04-08 06:45:57

标签: c++

我在包含的文件中构建一组函数,我希望能够运行我的测试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。使这项工作的语法是什么。提前谢谢,我在这个问题上找了一会儿,找不到任何东西。

3 个答案:

答案 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