哪一个更好?在 C++ 代码中使用 System() 函数还是使用源代码?
Which one is better? Using System() function inside C++ code or using source codes?
抱歉,如果问题标题不好,但我正在尝试解释我的意思:
据我所知,我可以使用 system()
函数在我的 C++ 代码中使用 Linux 终端命令。例如 system("aplay sound.wav");
。我不知道我能否像这样编写所有 Linux 命令,但是 aplay
可以。
所以,我的问题是:我想在我的 C++ program.I 中使用 espeak
,就像 espeak 读取我通过它的每个字符串(类似于 aplay
在上面所做的代码但尊重 "strings")。是通过 system()
函数调用它更好还是在我的 C++ 代码中编写这样的代码并在我想读取新字符串时更改 char* text
更好?:
#include <string.h>
#include <malloc.h>
#include <espeak-ng/speak_lib.h>
espeak_POSITION_TYPE position_type;
espeak_AUDIO_OUTPUT output;
char *path=NULL;
int Buflength = 500, Options=0;
void* user_data;
t_espeak_callback *SynthCallback;
espeak_PARAMETER Parm;
char Voice[] = {"English"};
char *text = {"this is a english test"};
unsigned int Size,position=0, end_position=0, flags=espeakCHARS_AUTO, *unique_identifier;
int main(int argc, char* argv[] )
{
output = AUDIO_OUTPUT_PLAYBACK;
int I, Run = 1, L;
espeak_Initialize(output, Buflength, path, Options );
espeak_SetVoiceByName(Voice);
const char *langNativeString = "en"; //Default to US English
espeak_VOICE voice;
memset(&voice, 0, sizeof(espeak_VOICE)); // Zero out the voice first
voice.languages = langNativeString;
voice.name = "US";
voice.variant = 2;
voice.gender = 1;
espeak_SetVoiceByProperties(&voice);
Size = strlen(text)+1;
espeak_Synth( text, Size, position, position_type, end_position, flags,
unique_identifier, user_data );
espeak_Synchronize( );
return 0;
}
哪个更快?
一般来说,在您考虑使用 system()
调用来执行另一个程序之前,我建议您更喜欢使用库函数,或者编写提供所需功能的代码。
如果有一个合适的 API(又名一组库函数)直接提供所需的功能,您的程序使用那个 API 可能会更可靠。显然,这是假设库函数可以正常工作,并且有足够的文档来正确使用它们。这里的风险与错误或文档不完善的库功能有关,以及这些库的作者在解决问题时的响应能力。
如果没有合适的 API 可用,那么下一个选择是自己实现所需的功能(使用您有权访问的代码和库),然后 - 假设你做了合理的工作 - 然后,再次,您的程序运行良好。这里的风险在你的控制之下——你对你想做的事情的理解程度如何,你设计和实现所需功能的能力如何(例如,工作超出你的理解程度?),以及你投入的努力把事情做好。
作为最后的手段,您可以使用 system()
调用。这里的问题是 system()
的行为是正式实现定义的,因此在主机系统、编译器及其标准库之间可能会有所不同。第二部分是您必须处理使用 system()
调用执行的程序(或 shell)的行为——例如,如果第三方程序的作者引入了新功能,它实际上可以改变该程序的运行方式——例如,添加 GUI、更改命令行选项等。虽然库函数的改变方式可能会破坏您的程序,但第三方程序使用 system()
调用执行更有可能随着时间的推移以破坏您的程序的方式发生变化。
我并不是建议您永远不要使用 system()
。但是,如果其他方法令人望而却步,而不是您使用的第一个工具,请将其视为一种选择。
抱歉,如果问题标题不好,但我正在尝试解释我的意思:
据我所知,我可以使用 system()
函数在我的 C++ 代码中使用 Linux 终端命令。例如 system("aplay sound.wav");
。我不知道我能否像这样编写所有 Linux 命令,但是 aplay
可以。
所以,我的问题是:我想在我的 C++ program.I 中使用 espeak
,就像 espeak 读取我通过它的每个字符串(类似于 aplay
在上面所做的代码但尊重 "strings")。是通过 system()
函数调用它更好还是在我的 C++ 代码中编写这样的代码并在我想读取新字符串时更改 char* text
更好?:
#include <string.h>
#include <malloc.h>
#include <espeak-ng/speak_lib.h>
espeak_POSITION_TYPE position_type;
espeak_AUDIO_OUTPUT output;
char *path=NULL;
int Buflength = 500, Options=0;
void* user_data;
t_espeak_callback *SynthCallback;
espeak_PARAMETER Parm;
char Voice[] = {"English"};
char *text = {"this is a english test"};
unsigned int Size,position=0, end_position=0, flags=espeakCHARS_AUTO, *unique_identifier;
int main(int argc, char* argv[] )
{
output = AUDIO_OUTPUT_PLAYBACK;
int I, Run = 1, L;
espeak_Initialize(output, Buflength, path, Options );
espeak_SetVoiceByName(Voice);
const char *langNativeString = "en"; //Default to US English
espeak_VOICE voice;
memset(&voice, 0, sizeof(espeak_VOICE)); // Zero out the voice first
voice.languages = langNativeString;
voice.name = "US";
voice.variant = 2;
voice.gender = 1;
espeak_SetVoiceByProperties(&voice);
Size = strlen(text)+1;
espeak_Synth( text, Size, position, position_type, end_position, flags,
unique_identifier, user_data );
espeak_Synchronize( );
return 0;
}
哪个更快?
一般来说,在您考虑使用 system()
调用来执行另一个程序之前,我建议您更喜欢使用库函数,或者编写提供所需功能的代码。
如果有一个合适的 API(又名一组库函数)直接提供所需的功能,您的程序使用那个 API 可能会更可靠。显然,这是假设库函数可以正常工作,并且有足够的文档来正确使用它们。这里的风险与错误或文档不完善的库功能有关,以及这些库的作者在解决问题时的响应能力。
如果没有合适的 API 可用,那么下一个选择是自己实现所需的功能(使用您有权访问的代码和库),然后 - 假设你做了合理的工作 - 然后,再次,您的程序运行良好。这里的风险在你的控制之下——你对你想做的事情的理解程度如何,你设计和实现所需功能的能力如何(例如,工作超出你的理解程度?),以及你投入的努力把事情做好。
作为最后的手段,您可以使用 system()
调用。这里的问题是 system()
的行为是正式实现定义的,因此在主机系统、编译器及其标准库之间可能会有所不同。第二部分是您必须处理使用 system()
调用执行的程序(或 shell)的行为——例如,如果第三方程序的作者引入了新功能,它实际上可以改变该程序的运行方式——例如,添加 GUI、更改命令行选项等。虽然库函数的改变方式可能会破坏您的程序,但第三方程序使用 system()
调用执行更有可能随着时间的推移以破坏您的程序的方式发生变化。
我并不是建议您永远不要使用 system()
。但是,如果其他方法令人望而却步,而不是您使用的第一个工具,请将其视为一种选择。