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

Setting #define identifier using command line argument

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

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

假设从 main() 更改此参数太麻烦了。

相反,我想在一些包含的头文件中使用 #define MY_PARAM my_val 其中 my_val 当程序为 运行.

时作为命令行参数

我正在使用 gcc 编译

有什么想法吗?

根据您的代码片段:

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 电话中的 return 代码,表示一切正常。

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

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

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

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

    [= 的选项的函数而变化。 27=]

希望这对任何想做类似事情的人有所帮助。