【问题标题】:Which one is better? Using System() function inside C++ code or using source codes?哪一个更好?在 C++ 代码中使用 System() 函数还是使用源代码?
【发布时间】:2018-05-09 19:37:36
【问题描述】:

对不起,如果问题标题不好,但我试图解释我的意思:

据我所知,我可以使用 system() 函数在我的 C++ 代码中使用 Linux 终端的命令。例如system("aplay sound.wav");。我不知道我能不能像这样写所有的 Linux 命令,但是aplay 可以。

所以,我的问题就在这里:我想在我的 C++ 程序中使用 espeak。我喜欢 espeak 读取我通过它传递的每个字符串(类似于 aplay 在上面的代码中所做的,但尊重“字符串”) .是通过 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;
}

哪个更快?

【问题讨论】:

  • 除了您过于简单的示例之外,使用程序中的 espeak API 可能比系统调用更有效。
  • 如果您考虑执行一些系统命令,那么您可能需要考虑为此目的使用 shell 脚本而不是 C++。
  • @VTT:我只有一个string/char 变量,我会在我的程序中多次更改它的内容,然后想通过espeak 传递它以在每次更改时读取它。

标签: c++ function terminal system espeak


【解决方案1】:

一般来说,我建议在考虑使用system() 调用来执行另一个程序之前,优先使用库函数,或者编写提供所需功能的代码。

如果有适当的 API(也就是一组库函数)直接提供所需的功能,那么如果您的程序使用该 API,它可能会更可靠。显然,这是假设库函数正常工作,并且有足够的文档来正确使用它们。这里的风险与错误或记录不充分的库函数以及这些库的作者在解决问题时的响应能力有关。

如果没有合适的 API 可用,那么下一个选项是自己实现所需的功能(使用您有权访问的代码和库)然后 - 假设您做了合理的工作 - 然后,您的程序再次运行得相当好.这里的风险在你的控制之下——你对你想要做什么的理解程度,你设计和实现所需功能的能力(例如,工作超出你的理解范围有多远?),以及你付出的努力把事情做好。

作为最后的手段,您可以使用system() 呼叫。这里的问题是system() 的行为是正式实现定义的,因此主机系统、编译器及其标准库之间可能会有所不同。第二部分是你必须处理使用system()调用执行的程序(或shell)的行为——例如,如果第三方程序的作者引入了新功能,它实际上可以改变如何该程序运行 - 例如,添加一个 GUI、更改命令行选项等。虽然库函数的变化方式可能会破坏您的程序,但使用 system() 调用执行的第三方程序更有可能随着时间的推移而变化以会破坏您的程序的方式。

我并不是建议你永远不要使用system()。但是,如果其他方法令人望而却步,则将其视为一种选择,而不是您使用的第一个工具。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-25
    • 1970-01-01
    • 2011-06-07
    • 1970-01-01
    • 1970-01-01
    • 2010-11-06
    • 1970-01-01
    • 2018-05-01
    相关资源
    最近更新 更多