使用命令行参数设置#define标识符

时间:2015-11-02 11:37:11

标签: c++ c++11 command-line-arguments

我正在编写一个python脚本来运行一个已编译的二进制文件,其源代码是用C ++编写的,可以使用命令行参数改变参数。

e.g。 os.system("./my_program " + my_arg)

让我们说从main()更改此参数太麻烦了。

相反,我想在一些包含的头文件中设置它 #define MY_PARAM my_val 其中my_val在程序运行时被视为命令行参数。

我正在使用gcc编译

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

根据您的代码段:

os.system("./my_program " + my_arg)

您只是尝试向您的程序发送参数输入。您不需要使用预处理器定义(例如#define SOMETHING)。 (事实上​​,你不能,因为二进制文件已经构建完毕。)

而是将main功能从int main()修改为int main(int argc, char *argv[])

您以类似于以下内容的方式使用它:

#include <iostream>

int main(int argc, char *argv[]) {
    for(int i = 0; i < argc; ++i)
        std::cout << "Argument " << i << ": " << argv[i] << std::endl;
    return 0;
}

示例从上面的代码运行,该代码放在test.cpp文件中,并从Python3交互式解释器中使用:

➜  /tmp  g++ test.cpp -o argtest
➜  /tmp  ./argtest
Argument 0: ./argtest
➜  /tmp  ./argtest a b c d e 123
Argument 0: ./argtest
Argument 1: a
Argument 2: b
Argument 3: c
Argument 4: d
Argument 5: e
Argument 6: 123
➜  /tmp  python3
Python 3.4.3+ (default, Oct 14 2015, 16:03:50)
[GCC 5.2.1 20151010] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from os import system
>>> system('./argtest a b c 123')
Argument 0: ./argtest
Argument 1: a
Argument 2: b
Argument 3: c
Argument 4: 123
0
>>>

最后的零是来自Python system调用的返回代码,说一切都很顺利。

答案 1 :(得分:0)

愚蠢的问题。我想我在问之前没有正确理解我试图解决的问题!我通过以下方式解决了这个问题:

  1. 使用-D选项在makefile中添加可选参数以设置这些编译时变量。这将使用运行make时给出的值替换指定的变量名称。

  2. 一个python脚本循环遍历一堆选项,每次调用os.system("make OPT1=" + str(opt1) + "OPT2=" + str(opt2))等后跟os.system(“./ myprog | tee mylogfile.log”)

  3. 然后python脚本解析了日志文件,其中包含的输出随着作为make的参数输入的选项而变化。

  4. 希望这有助于任何想要做类似事情的人。