Как избежать двойной кавычки в nmake - PullRequest
0 голосов
/ 23 октября 2018

Я пытаюсь передать строковый литерал через флаг /D компилятору через скрипт nmake в MS Visual Studio 2013+.Базовый шаблон:

CPPFLAGS=/DSOME_STRING_VAR="asdf"

main.exe: main.cpp
    $(CPP) $(CPPFLAGS) # ...

А внутри main.cpp я хотел бы иметь возможность сделать что-то вроде:

const char *some_string_var = SOME_STRING_VAR;

Пока что каждый вариант этого я пробую результатыв чем-то вроде:

main.cpp(271) : error C2065: 'asdf' : undeclared identifier

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

Есть ли способ избежать двойных кавычек в nmake, чтобы они правильно выполнялисьпередается в команду компиляции?

Для бонусных баллов выполняется ли команда nmake оболочкой, такой как пакет?То есть мне нужно беспокоиться об одном или двух уровнях побега здесь?

Я был бы рад поддержать Visual Studio 2015+, если бы в более новой версии было доступно более чистое решение.

1 Ответ

0 голосов
/ 06 января 2019

tldr: экранируйте двойные кавычки с помощью обратной косой черты .


Если ваш тестовый файл main.cpp имеет вид:

#include <iostream>
int main() {
  const char *some_string_var = SOME_STRING_VAR;
  std::cout << some_string_var << std::endl;
}

, то команда:

CL /DSOME_STRING_VAR=\"asdf\" main.cpp

будет работать по желанию, при этом программа тестирования выдаст:

>.\main.exe
asdf

И если ваша makefile - это одна строка:

CPPFLAGS=/DSOME_STRING_VAR=\"asdf\"

тогда:

>nmake main.exe

также будет работать.

Я не смог найти никаких ссылок для этого.Протестировано на VS2013 и VS2017.

...