【问题标题】:How to use #define in system() in C++?如何在 C++ 的 system() 中使用#define?
【发布时间】:2014-04-16 17:52:10
【问题描述】:

请考虑以下代码:

#define LV_INFO(major,minor) lvdisplay -c | grep major':'minor >/root/lvInfo.txt

int main(){
    int major=256,minor=6;
    system(LV_INFO(major,minor));
    return 0;
}

但上面的代码不起作用,因为系统需要命令作为双引号的输入参数。

意思是,

#define LV_INFO(major,minor) "lvdisplay -c|grep major':'minor >/root/lvinfo.txt"

但它也不起作用。它不会放置 main() 传递的主要和次要值。

如何在系统调用中使用给定参数运行上述命令?

请帮忙。

【问题讨论】:

    标签: c++ grep c-preprocessor quotes system-calls


    【解决方案1】:

    如果您的值(主要和次要)都是常量,您可以简单地将结果字符串化。

    #define LV_INFO(major,minor) "lvdisplay -c | grep " STRINGIFY(major) "':'" STRINGIFY(minor) " >/root/lvInfo.txt"
    #define MAJOR 256
    #define MINOR 6
    #define STRINGIFY(a) #a
    #define _LV_INFO LV_INFO(MAJOR, MINOR)
    
    #include <stdio.h>
    
    int main(){
        printf(_LV_INFO);
        return 0;
    }
    

    如果您的值不是恒定的,通过(例如,来自命令行参数,这绝对行不通。例如,您需要从sprintf 构建字符串。

    编辑:按照您的命令,以下是使用sprintf 构建命令字符串的方法:

    int main(){
        int major=256,minor=6;
        char command[256];
        sprintf(command, "lvdisplay -c | grep %d':'%d >/root/lvInfo.txt", major, minor);
        system(command);
        return 0;
    }
    

    【讨论】:

    • 我尝试了您的解决方案,它适用于常量值。但我的程序取决于运行时值。所以,我尝试从 main() 传递值并在#define 中使用它们作为 - #define LV_INFO(major,minor) "lvdisplay -c|grep" #major "':'" #minor ">/root/lvInfo. txt"。但它再次不起作用。它不采用参数的运行时值。它只是将字符串主要和次要放在命令中。请帮助我使用运行时值运行它。
    • 恐怕您将无法对运行时值进行字符串化,因为字符串化发生在编译时。正如我所建议的,您应该使用sprintf 或类似函数来构建您的命令字符串。
    • 您能否更具体地了解使用 sprintf 构建字符串并在 #define 中使用它?具体怎么做?
    • 同样,您的解决方案运行良好。谢谢。我只是希望#define 有一个解决方案。如果您能从这个角度提出任何建议,那就太好了。
    猜你喜欢
    • 2014-08-11
    • 2016-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-27
    • 1970-01-01
    • 2011-02-19
    相关资源
    最近更新 更多