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));
谢谢!我认为这是一个完美的解决方案!