使用命令行参数设置#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 代码,表示一切正常。
愚蠢的问题。我想我在提问之前没有正确理解我要解决的问题!我通过以下方式解决了这个问题:
使用 -D 选项在 makefile 中添加可选参数以设置这些编译时变量。这会将指定的变量名称替换为 运行 make
时给出的值。
一个 python 脚本循环遍历一堆选项,每次调用 os.system("make OPT1=" + str(opt1) + "OPT2=" + str(opt2))
等,然后是 os.system("./myprog | tee mylogfile.log")
然后 python 脚本解析了日志文件,其中包含的输出随着作为参数输入到 make
.
[= 的选项的函数而变化。 27=]
希望这对任何想做类似事情的人有所帮助。
我正在编写一个 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 代码,表示一切正常。
愚蠢的问题。我想我在提问之前没有正确理解我要解决的问题!我通过以下方式解决了这个问题:
使用 -D 选项在 makefile 中添加可选参数以设置这些编译时变量。这会将指定的变量名称替换为 运行
make
时给出的值。一个 python 脚本循环遍历一堆选项,每次调用
os.system("make OPT1=" + str(opt1) + "OPT2=" + str(opt2))
等,然后是 os.system("./myprog | tee mylogfile.log")然后 python 脚本解析了日志文件,其中包含的输出随着作为参数输入到
[= 的选项的函数而变化。 27=]make
.
希望这对任何想做类似事情的人有所帮助。