Подтвердить что ты не робот

Как определить строковый литерал в командной строке gcc?

В командной строке gcc я хочу определить строку, такую ​​как -Dname=Mary, затем в исходном коде я хочу printf("%s", name); распечатать Mary.
Как я могу это сделать?

4b9b3361

Ответ 1

Два варианта. Сначала избегайте кавычек, чтобы оболочка их не ест:

gcc -Dname=\"Mary\"

Или, если вы действительно хотите -Dname = Mary, вы можете его выровнять, хотя он немного взломан.

#include <stdio.h>

#define STRINGIZE(x) #x
#define STRINGIZE_VALUE_OF(x) STRINGIZE(x)


int main(int argc, char *argv[])
{
    printf("%s", STRINGIZE_VALUE_OF(name));
}

Обратите внимание, что STRINGIZE_VALUE_OF с радостью оценит до окончательного определения макроса.

Ответ 2

чтобы избежать "съедания" кавычек и других символов, вы можете попробовать одиночные кавычки, например:

gcc -o test test.cpp -DNAME='"Mary"'

Таким образом, у вас есть полный контроль над тем, что определено (кавычки, пробелы, специальные символы и все).

Ответ 3

Наиболее переносимым способом, который я нашел до сих пор, является использование \"Mary\" - он будет работать не только с gcc, но и с любым другим компилятором C. Например, если вы попытаетесь использовать /Dname='"Mary"' с компилятором Microsoft, он остановится с ошибкой, но /Dname=\"Mary\" будет работать.

Ответ 4

В Ubuntu я использовал псевдоним, который определяет CFLAGS, а CFLAGS включает макрос, который определяет строку, а затем я использую CFLAGS в Makefile. Мне пришлось избегать символов двойной кавычки, а также символов \. Это выглядело примерно так:

CFLAGS='" -DMYPATH=\\\"/home/root\\\" "'

Ответ 5

FYI: По-видимому, даже разные версии одной и той же инструментальной цепочки на одной и той же системе могут действовать по-другому в этом отношении... (Как и в случае, казалось бы, это будет проблема передачи оболочки, но, видимо, она не ограничивается только оболочкой).

Здесь мы имеем xc32-gcc 4.8.3 vs. (avr-) gcc 4.7.2 (и несколько других) используя тот же make файл и main.c, с той лишь разницей, что 'make CC=xc32-gcc' и т.д.

CFLAGS += -D'THING="$(THINGDIR)/thing.h"' был использован во многих версиях gcc (и bash) в течение нескольких лет.

Чтобы сделать это совместимым с xc32-gcc (и в свете другого комментария, утверждающего, что "более портативный, чем" ), необходимо выполнить следующее:

CFLAGS += -DTHING=\"$(THINGDIR)/thing.h\"

ifeq "$(CC)" "xc32-gcc"
CFLAGS := $(subst \",\\\",$(CFLAGS))
endif

чтобы сделать вещи действительно запутанными в обнаружении этого: по-видимому, некорректный -D с//приводит к #define с комментарием в конце... например.

THINGDIR=/thingDir/#define /thingDir//thing.h#define /thingDir

(Спасибо за помощь от ответа s здесь, btw).

Ответ 6

Это мое решение для: -DUSB_PRODUCT=\""Arduino Leonardo\""
Я использовал его в make файле с помощью: GNU Make 3,81 (от GnuWin32)
 и
avr-g++ (AVR_8_bit_GNU_Toolchain_3.5.0_1662) 4.9.2

Результаты в предварительно скомпилированном файле (опция -E для g++):
const u8 STRING_PRODUCT[] __attribute__((__progmem__)) = "Arduino Leonardo";