哪一个更好?在 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()。但是,如果其他方法令人望而却步,而不是您使用的第一个工具,请将其视为一种选择。