有两个选项。第一个是转义引号,以防shell将其截断:
gcc -Dname=\"Mary\"
或者,如果你真的想要-Dname=Mary,你可以将其字符串化,尽管这有点hacky。
#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 将欣然评估宏的最终定义。gcc -o test test.cpp -DNAME='"Mary"'
这样你就可以完全控制定义的内容(引号、空格、特殊字符等等)。
\"Mary\"
。它不仅适用于GCC,还适用于任何其他C编译器。例如,如果您尝试在Microsoft编译器中使用/Dname='"Mary"'
,它会停止并显示错误,但是/Dname=\"Mary\"
将可以正常工作。我在Ubuntu上使用了一个别名(alias),它定义了CFLAGS。CFLAGS包括一个定义字符串的宏,在Makefile中我使用了CFLAGS。我需要转义双引号和反斜杠。代码大致如下:
CFLAGS='" -DMYPATH=\\\"/home/root\\\" "'
1) DEFINES=-DLOGPATH=\"./logfile\" CFLAGS = -v $(DEFINES)....
2) DEFINES=-DLOGPATH=\\\"./logfile\\\" CFLAGS = "-v $(DEFINES)...."
使用-v编译器选项可以查看预处理器的操作。 - Den-Jasonconst u8 STRING_PRODUCT[] __attribute__((__progmem__)) = "Arduino Leonardo";
#include <stdio.h>
#define A B+20
#define B 10
int main()
{
#ifdef __DEBUG__
printf("__DEBUG__ DEFINED\n");
printf("%d\n",A);
#else
printf("__DEBUG__ not defined\n");
printf("%d\n",B);
#endif
return 0;
}
If I compile:
$gcc test.c
输出:
__DEBUG__ not defined
10
If I compile:
$gcc -D __DEBUG__ test.c
输出:
__DEBUG__ defined
30
我刚发现我们的一个应用程序在Ubuntu上无法编译。由于Linux和Windows没有达成共识,我使用了这个方法:
NAME := "Mary"
ifeq ($(SystemRoot),)
# building on another OS
CFLAGS_ADD += -Dname=\"Mary\"
else
# building on Windows
CFLAGS_ADD += -Dname=\\\"Mary\\\"
endif
提示:显然,即使是同一系统上的同一工具链的不同版本,在这方面的表现也可能不同... (就像,似乎这是一个shell传递问题,但显然不仅限于shell)。
在这里,我们有xc32-gcc 4.8.3与(avr-)gcc 4.7.2(以及其他几个)
使用相同的makefile和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会导致#定义以注释结尾...例如:
THINGDIR=/thingDir/
-> #define /thingDir//thing.h
-> #define /thingDir
(顺便感谢这里的答案提供的帮助)。
考虑:
{
"version": "2.0.0",
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: g++.exe build active file",
"command": "C:\\Program Files\\mingw-w64\\x86_64-8.1.0-posix-seh-rt_v6-rev0\\mingw64\\bin\\g++.exe",
"args": [
"-g",
"-DSHERAJ",
"${file}",
"-o",
"${fileDirname}\\${fileBasenameNoExtension}.exe"
],
"options": {
"cwd": "C:\\Program Files\\mingw-w64\\x86_64-8.1.0-posix-seh-rt_v6-rev0\\mingw64\\bin"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "compiler: \"C:\\Program Files\\mingw-w64\\x86_64-8.1.0-posix-seh-rt_v6-rev0\\mingw64\\bin\\g++.exe\""
}
]
}
我在 Visual Studio Code 中完成了 #define SHERAJ
。它非常适用于竞赛编程,因为:
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
#ifdef SHERAJ
freopen("input.txt", "r", stdin);
#endif
int T;
cin>>T;
for(int test_case = 1;test_case<=T;test_case++) {
cout<<"Hello, World!"<<endl;
}
}
对我来说,在Mac和Windows上,这对Visual Studio Code都有效。这里描述的其他方法,如"-Dname=\"SHERAJ\""
和"-Dname=\\\"SHERAJ\\\""
对我无效。
所以答案是"-DSHERAJ"
。
-DNAME=\"Mary\"
),以便它们看起来像其他宏。 - JSBձոգչ