有没有办法让gcc/g ++从命令行转储它的预处理器定义?我的意思是__GNUC__,__STDC__等等.
我使用打印出C预处理器的输出
gcc -E a.c
Run Code Online (Sandbox Code Playgroud)
输出包含许多行
# 1 "a.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "a.c"
# 1 "c:\\mingw\\bin\\../lib/gcc/mingw32/4.5.0/../../../../include/stdio.h" 1 3
# 19 "c:\\mingw\\bin\\../lib/gcc/mingw32/4.5.0/../../../../include/stdio.h" 3
# 1 "c:\\mingw\\bin\\../lib/gcc/mingw32/4.5.0/../../../../include/_mingw.h" 1 3
# 31 "c:\\mingw\\bin\\../lib/gcc/mingw32/4.5.0/../../../../include/_mingw.h" 3
# 32 "c:\\mingw\\bin\\../lib/gcc/mingw32/4.5.0/../../../../include/_mingw.h" 3
# 20 "c:\\mingw\\bin\\../lib/gcc/mingw32/4.5.0/../../../../include/stdio.h" 2 3
Run Code Online (Sandbox Code Playgroud)
我从未在C中看到过这种语法.有人可以解释这是做什么的吗?
我想要的不是标准的C预处理器,而是可以从某个地方接受的变体 - 可能是命令行通过-DNAME1和-UNAME2选项 - 定义了哪些宏的规范,然后消除了死码.
通过一些例子可能更容易理解我所追求的内容:
#ifdef NAME1
#define ALBUQUERQUE "ambidextrous"
#else
#define PHANTASMAGORIA "ghostly"
#endif
Run Code Online (Sandbox Code Playgroud)
如果命令是使用'-DNAME1'运行的,则输出将为:
#define ALBUQUERQUE "ambidextrous"
Run Code Online (Sandbox Code Playgroud)
如果命令是使用'-UNAME1'运行的,则输出将为:
#define PHANTASMAGORIA "ghostly"
Run Code Online (Sandbox Code Playgroud)
如果命令是在没有选项的情况下运行的,则输出将与输入相同.
这是一个简单的例子 - 我希望代码也可以处理更复杂的情况.
用现实世界但仍然简单的例子来说明:
#ifdef USE_VOID
#ifdef PLATFORM1
#define VOID void
#else
#undef VOID
typedef void VOID;
#endif /* PLATFORM1 */
typedef void * VOIDPTR;
#else
typedef mint VOID;
typedef char * VOIDPTR;
#endif /* USE_VOID */
Run Code Online (Sandbox Code Playgroud)
我想运行命令-DUSE_VOID -UPLATFORM1并获取输出:
#undef VOID
typedef void VOID;
typedef void * VOIDPTR;
Run Code Online (Sandbox Code Playgroud)
另一个例子:
#ifndef DOUBLEPAD
#if …Run Code Online (Sandbox Code Playgroud)