Isa*_*own 5 c gcc cygwin batch-file c-preprocessor
我正在使用一个专有的开发环境来编译用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 文件夹中的哪个可执行文件,更不用说使用哪些标志来运行文件了。
几乎任何 C 预处理器,包括 gcc 的cpp,都会假设它的输入是有效的 C 代码。它必须按照 C(或 C++,或 Objective-C)规则对输入进行标记,因为它必须将其输入解析为标记(更准确地说是预处理标记)。令牌级别以上的构造不应该是问题。
您当然可以使用cpp或gcc -E预处理不是 C 源代码的文本,但某些输入结构会导致问题。
从评论中举个例子:
$ cat foo.txt
#define ADDTHEM(x, y) ((x) + (y))
ADDTHEM(2, 3)
$ gcc -E - < foo.txt
# 1 "<stdin>"
# 1 "<command-line>"
# 1 "<stdin>"
((2) + (3))
Run Code Online (Sandbox Code Playgroud)
请注意,我必须使用gcc -E - < foo.txt而不是gcc -E foo.txt,因为.txt默认情况下gcc 将文件视为链接器输入文件。
但是,如果您添加一些foo.txt不包含有效 C 预处理器标记的内容,您可能会遇到问题:
$ cat foo.txt
#define ADDTHEM(x, y) ((x) + (y))
ADDTHEM(2, 3)
ADDTHEM('c, "s)
$ gcc -E - < foo.txt
# 1 "<stdin>"
# 1 "<command-line>"
# 1 "<stdin>"
((2) + (3))
<stdin>:3:9: warning: missing terminating ' character [enabled by default]
<stdin>:3:0: error: unterminated argument list invoking macro "ADDTHEM"
ADDTHEM
Run Code Online (Sandbox Code Playgroud)
(将 Ada 源代码提供给 C 预处理器的尝试遇到了这种问题,因为 Ada 使用独立的撇号'字符作为其属性语法。)
因此,如果输入语言不使用无效的 C 预处理器标记,您可以这样做。
有关预处理令牌的更多信息,请参阅C 标准的 N1570 草案第 6.4 节。
我实际上在检查GNU cpp 手册之前写了上面的内容,其中说:
C 预处理器旨在仅用于 C、C++ 和 Objective-C 源代码。过去,它被滥用为通用文本处理器。如果输入不遵守 C 的词法规则,它就会窒息。例如,撇号将被解释为字符常量的开头,并导致错误。此外,您不能依赖它保留对 C 系列语言不重要的输入特征。如果对 Makefile 进行了预处理,则所有硬制表符都将被删除,并且 Makefile 将不起作用。
话虽如此,您通常可以在非 C 语言上使用 cpp。其他 Algol 式编程语言通常是安全的(Pascal、Ada 等)。汇编也是如此,请谨慎使用。`-traditional-cpp' 模式保留了更多的空白,否则更宽容。许多问题可以通过编写 C 或 C++ 风格的注释而不是本机语言注释并保持宏简单来避免。
在可能的情况下,您应该使用适合您正在编写的语言的预处理器。GNU 汇编器的现代版本具有宏功能。大多数高级编程语言都有自己的条件编译和包含机制。如果所有其他方法都失败了,请尝试使用真正的通用文本处理器,例如 GNU M4。
(该手册的作者显然忽略了 Ada 属性语法的问题。)