Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何将#定义的字符串插入system()命令?(win32)_C_Windows_C Preprocessor - Fatal编程技术网

C 如何将#定义的字符串插入system()命令?(win32)

C 如何将#定义的字符串插入system()命令?(win32),c,windows,c-preprocessor,C,Windows,C Preprocessor,以下是我试图做的一个过于简化的版本: #define LOGDIRECTORY C:\\logs\\ system("mkdir LOGDIRECTORY"); 但是,预处理器不是交换已定义的名称,而是不使用。相反,系统命令实际上认为LOGDIRECTORY是名称,因此在启动程序时出错 我知道这是错误的,我一定可以用“标记或其他字符来指定我想要的内容,但我无法理解。我不想硬编码目录和文件名,因为将来可能有人想更改它们,而且更改定义比更改整个函数等要容易得多 PS,我用普通的C编码 #defin

以下是我试图做的一个过于简化的版本:

#define LOGDIRECTORY C:\\logs\\
system("mkdir LOGDIRECTORY");
但是,预处理器不是交换已定义的名称,而是不使用。相反,系统命令实际上认为
LOGDIRECTORY
是名称,因此在启动程序时出错

我知道这是错误的,我一定可以用
标记或其他字符来指定我想要的内容,但我无法理解。我不想硬编码目录和文件名,因为将来可能有人想更改它们,而且更改定义比更改整个函数等要容易得多

PS,我用普通的C编码

#define LOGDIRECTORY C:\\logs\\
#define DEF2STR(x) #x
system("mkdir " DEF2STR(LOGDIRECTORY));
#define LOGDIRECTORY_WITH_QUOTES "C:\\logs\\"
system("mkdir " LOGDIRECTORY_WITH_QUOTES);
在C语言中,您可以通过编写两个字符串文本来实现简单的字符串连接,两个文本之间没有运算符。
“A”“B”
将在编译时转换为
“AB”
。您还可以使用它将长字符串拆分为多行

printf("a very long "
"string indeed");

要将define转换为正确的字符串,请使用井号(#)在宏中,或跳过整个过程,并在定义本身中包含引号。

如果使用GCC编译,您将别无选择,只能使用引号包装定义,因为最后一个尾随反斜杠将被解释为行连续字符,如果这本身不会导致错误,倒数第二个反斜杠将被删除可能会引发错误。但是,如果您选择仅删除尾随的反斜杠,则仍然需要使用两个级别的字符串化宏,否则您的syscal将为“mkdir LOGDIRECTORY”。请参阅

因此,上述示例将变成:

#define LOGDIRECTORY C:\\logs
#define DEF2STR(x) #x
#define STR(x) DEF2STR(x)
system("mkdir " STR(LOGDIRECTORY));

谢谢!我认为这是一个完美的解决方案!