我常常看到__WIN32,WIN32或者__WIN32__.我认为这取决于使用的预处理器(来自visual studio,或gcc等).
我现在必须首先检查os,然后检查使用过的编译器吗?我们在这里使用G ++ 4.4.x,Visual Studio 2008和Xcode(我假设它是gcc)和我们正在使用的ATM __WIN32__,__APPLE__和__LINUX__.
是否有一个选项,GCC预处理器可以生成C源代码并过滤掉不相关的源代码?
例如,一个.c文件有一个#define开关来定义许多不同的平台.我只对一个平台感兴趣,我希望C预处理器过滤掉不相关的代码.
GCC是否支持这一点?
我正在使用一个专有的开发环境来编译用C和 IEC 61131 语言编写的代码。对于C编译,它使用 GCC 4.1.2 和这些构建选项:
-fPIC -O0 -g -nostartfiles -Wall -trigraphs -fno-asm
Run Code Online (Sandbox Code Playgroud)
编译是由使用 Cygwin 在 windows 上运行的程序完成的。
我的问题是,IEC 语言预处理器不是那么有用(根本不支持 #define),我想使用宏!我不明白为什么 GCC 预处理器会真正关心它正在处理的语言(我的目标语言是结构化文本),所以我想看看是否有人可能知道一种方法来处理不同文件类型的文件然后不会进一步编译(我只是在通过 IEC 编译器运行文件之前寻找宏扩展)。我对编译器选项和环境一无所知,因为我从来没有处理过它们,我只是编写C代码,它神奇地编译并传输到我的目标系统来运行。
我真正能做的唯一事情就是添加构建选项并在执行任何操作之前执行批处理文件。我认为我最大的希望在于使用批处理文件来处理某个扩展名的所有文件,但我什至不知道要使用 gnuinst 文件夹中的哪个可执行文件,更不用说使用哪些标志来运行文件了。
对于源级别分析,我需要扩展宏,除了那些#include,是否可能?
例如,在下面的代码片段中,我只希望assert扩展为__assert_fail,而不是包含assert.h和扩展assert.
#include <assert.h>
int main(void) {
assert(0); // expand this
return 0;
}
Run Code Online (Sandbox Code Playgroud)