这是我想要做的过于简化的版本:
#define LOGDIRECTORY C:\\logs\\
system("mkdir LOGDIRECTORY");
然而,预处理器不是替换掉定义的名称。相反,系统命令实际上认为LOGDIRECTORY
是名称,因此在启动程序时会向我发送错误。
我知道这是错的,我必须要用"
标记或其他字符来指定我想要的东西,但我无法理解。我不想对目录和文件名进行硬编码,因为有人可能希望将来更改它们,并且更改定义比整个函数更容易等。
PS,我用简单的 C 编码。
答案 0 :(得分:8)
#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转换为正确的字符串,请在宏中使用井号(#)或跳过整个事物并在define本身中包含引号。
答案 1 :(得分:1)
如果您正在使用GCC进行编译,那么除了用引号包装define之外别无选择,因为最终的尾部反斜杠将被解释为行继续符,如果这不会导致错误,倒数第二个反斜杠可能会引发错误。但是,如果您选择只删除尾部反斜杠,则仍需要使用两级字符串化宏,或者您的syscal将是“mkdir LOGDIRECTORY”。见http://gcc.gnu.org/onlinedocs/cpp/Stringification.html
所以上面的例子将成为:
#define LOGDIRECTORY C:\\logs
#define DEF2STR(x) #x
#define STR(x) DEF2STR(x)
system("mkdir " STR(LOGDIRECTORY));