Windows 从GCC获取预定义宏,而不使用临时文件

Windows 从GCC获取预定义宏,而不使用临时文件,windows,gcc,command-line,mingw,c-preprocessor,Windows,Gcc,Command Line,Mingw,C Preprocessor,是否有一种方法可以从GCC预处理器检索预定义的宏,而不必使用临时文件(例如使用管道) 这里有一个关于StackOverflow的类似问题,但是它的所有答案都使用命令行,而我需要从进程中读取提到的数据。 谷歌基本上会返回很多关于这个问题的命令行版本的答案 当我尝试使用管道在Linux上执行命令行技巧将输出定向到/dev/null或在Windows上执行NUL时: RunAndGetOutput("cpp -dM -E < NUL"); RunAndGetOutput(

是否有一种方法可以从GCC预处理器检索预定义的宏,而不必使用临时文件(例如使用管道)

这里有一个关于StackOverflow的类似问题,但是它的所有答案都使用命令行,而我需要从进程中读取提到的数据。

谷歌基本上会返回很多关于这个问题的命令行版本的答案

当我尝试使用管道在Linux上执行命令行技巧将输出定向到/dev/null或在Windows上执行NUL时:

RunAndGetOutput("cpp -dM -E < NUL");
RunAndGetOutput(“cpp-dM-E
。。。出现以下错误:


cpp.exe:错误:我不确定
NUL
在windows下的行为,但我假设它类似于Unix/Linux中的
/dev/null

在我的Ubuntu虚拟机上,我可以做:

cpp -dM -E -xc /dev/null
因此,我假设在windows下,您可以执行以下操作:

cpp -dM -E -xc NUL
这假设
NUL
的行为本质上类似于一个空文件。如果
type NUL
的输出是这里的任何指示符,那么希望是这样

或者,如果这不起作用,您可以在
cmd.exe
子shell中执行
cpp
命令并重定向:

cmd.exe /C "cpp -dM -E < NUL"
cmd.exe/C“cpp-dM-E

RunAndGetOutput()
的角度来看,这只是一个
cmd.exe
命令,只传递了几个参数,没有管道/重定向。但是
cmd.exe
shell将把传递的字符串解释为命令,重要的是将理解如何处理
我不确定
NUL
在windows下的行为,但我假设它类似于Unix/Linux中的
/dev/null

在我的Ubuntu虚拟机上,我可以做:

cpp -dM -E -xc /dev/null
因此,我假设在windows下,您可以执行以下操作:

cpp -dM -E -xc NUL
这假设
NUL
的行为本质上类似于一个空文件。如果
type NUL
的输出是这里的任何指示符,那么希望是这样

或者,如果这不起作用,您可以在
cmd.exe
子shell中执行
cpp
命令并重定向:

cmd.exe /C "cpp -dM -E < NUL"
cmd.exe/C“cpp-dM-E

RunAndGetOutput()
的角度来看,这只是一个
cmd.exe
命令,只传递了几个参数,没有管道/重定向。但是
cmd.exe
shell将把传递的字符串解释为命令,重要的是,它将理解如何处理
,听起来您需要一个命名管道。查找CreateNamedPipe(Windows)或mkfifo(POSIX)。这样,您就可以获得一个特殊的文件名,作为输出文件传递给GCC。通常基于PID.RunAndGetOutput命名它的恼人的地方不是解释shell元字符,所以gcc看到一个
,听起来你需要一个命名管道。查找CreateNamedPipe(Windows)或mkfifo(POSIX)。这样,您就可以获得一个特殊的文件名,作为输出文件传递给GCC。通常基于PID.RunAndGetOutput命名它的恼人的地方不是解释shell元字符,因此gcc看到了一个
@nos-是的,因为总是有不止一种方法来做事情。但是要小心-windows
echo
有点不同-如果单独运行,它将打印
echo已打开。
。要真正回显空行,需要执行
echo.
。所以
cmd.exe/C“echo.|cpp-xc-dM-E-”
应该可以做到这一点。@nos-是的,因为做事总是有多种方法。但是要小心-windows
echo
有点不同-如果单独运行,它将打印
echo已打开。
。要真正回显空行,需要执行
echo.
。所以
cmd.exe/C“echo.|cpp-xc-dM-E-”
应该可以做到这一点。