Как вставить строку #defined в команду system ()? (Win32) - PullRequest
2 голосов
/ 22 ноября 2010

Вот слишком упрощенная версия того, что я пытаюсь сделать:

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

Однако препроцессор вместо замены заданного имени не является. Вместо этого системная команда на самом деле думает, что LOGDIRECTORY - это имя, и, таким образом, выдает ошибки при запуске программы.

Я знаю, что это неправильно, и я должен что-то сделать со значками " или другими символами, чтобы указать, что я хочу, но я не могу понять. Я не хочу жестко кодировать каталог и имена файлов, потому что кто-то может захотеть изменить их в будущем, и было бы намного проще изменить определение, чем всю функцию и т. Д.

PS, я кодирую это просто C .

Ответы [ 2 ]

8 голосов
/ 22 ноября 2010
#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");

Чтобы преобразовать определение в правильную строку, используйте знак фунта ( # ) в макросе или пропуститевсе это и включить кавычки в само определение.

1 голос
/ 16 августа 2013

Если бы вы компилировали с помощью GCC, у вас не было бы другого выбора, кроме как заключить определение в кавычки, поскольку конечный завершающий обратный слеш интерпретировался бы как символ продолжения строки, и если это само по себе не вызывает ошибку, предпоследнийобратная косая черта, скорее всего, вызовет ошибку.Однако, если вы решили просто избавиться от конечной обратной косой черты, вам все равно придется использовать два уровня макросов строковой классификации, иначе ваш 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));
...