代码之家  ›  专栏  ›  技术社区  ›  WDR

哪一个更好?在C++代码中使用System()函数还是使用源代码?

  •  -1
  • WDR  · 技术社区  · 7 年前

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

    我知道我可以用 system() system("aplay sound.wav"); . 我不知道我是否可以像这样编写所有的Linux命令,但是 aplay 作品

    所以,我的问题是:我想使用 espeak 在我的C++程序中。我喜欢espeak读取我通过它传递的每个字符串(比如 aplay公司 在上述代码中,但与“字符串”有关。打个电话好吗 系统() 函数,或者最好在我的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;
    }
    

    1 回复  |  直到 7 年前
        1
  •  1
  •   Peter    7 年前

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

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

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

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

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