运行 GCC 预处理器非 C 文件

2023-11-25

我正在使用专有的开发环境来编译用以下语言编写的代码C,以及 IEC 61131 语言。为了C编译时,它使用 GCC 4.1.2 和以下构建选项:

-fPIC -O0 -g -nostartfiles -Wall -trigraphs -fno-asm

编译是由在 Windows 上运行的程序利用 Cygwin 完成的。

我的问题是,IEC 语言预处理器不是那么有用(根本不支持#define),我想使用宏!我不明白为什么 GCC 预处理器真的关心它正在处理什么语言(我的目标语言是结构化文本),所以我想看看是否有人知道一种方法来让它处理不同文件类型的文件然后不会进一步编译(我只是在文件通过 IEC 编译器运行之前寻找宏扩展)。我对编译器选项和环境非常无知,因为我从来没有处理过它们,我只是写C代码,它神奇地编译并传输到我的目标系统来运行。

我真正能做的唯一事情就是添加构建选项并在执行任何操作之前执行批处理文件。我认为我最大的希望在于使用批处理文件来处理特定扩展名的所有文件,但我什至不知道要使用 gnuinst 文件夹中的哪些可执行文件,更不用说使用哪些标志来运行文件了。


几乎任何 C 预处理器,包括 gcccpp,将假设其输入是有效的 C 代码。它必须按照 C(或 C++、或 Objective-C)规则对输入进行标记,因为它必须将其输入解析为标记(更准确地说是预处理标记)。令牌级别之上的构造不应成为问题。

你当然可以使用cpp or 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))

请注意,我必须使用gcc -E - < foo.txt而不是gcc -E foo.txt,因为 gcc 对待.txt文件默认作为链接器输入文件。

但如果你添加一些内容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

(尝试将 Ada 源代码提供给 C 预处理器会遇到此类问题,因为 Ada 使用独立的撇号'其属性语法的字符。)

所以你可以做到if输入语言不使用无效的 C 预处理器标记。

See N1570草案有关预处理标记的更多信息,请参见 C 标准第 6.4 节。

我实际上在检查之前写了上面的内容GNU cpp 手册,其中说:

C 预处理器仅适用于 C、C++ 和 Objective-C 源代码。过去曾被滥用为将军 文本处理器。它会因为不遵守 C 词法的输入而卡住 规则。例如,撇号将被解释为 字符常量,并导致错误。另外,你不能依赖它 保留对输入不重要的特征 C 族语言。如果一个 Makefile 被预处理,所有的硬选项卡 将被删除,并且 Makefile 将不起作用。

话虽如此,您通常可以在事物上使用 cpp 不是 C。其他类似 Algol 的编程语言通常是安全的 (Pascal、Ada 等)汇编也是如此,请谨慎使用。 `-传统-cpp' 模式保留更多空白,并且在其他方​​面更宽松。许多 的问题可以通过编写 C 或 C++ 风格的注释来避免 而不是本地语言注释,并保持宏简单。

只要有可能,您应该使用适合的预处理器 您正在编写的语言。现代版本的 GNU 汇编器有 宏观设施。大多数高级编程语言都有自己的 条件编译和包含机制。如果一切都失败了 尝试真正的通用文本处理器,例如 GNU M4。

(该手册的作者显然忽略了 Ada 属性语法的问题。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

运行 GCC 预处理器非 C 文件 的相关文章

  • 如何在c++中读取pcap文件来获取数据包信息?

    我想用 C 编写一个程序来读取 pcap 文件并获取数据包的信息 例如 len sourc ip flags 等 现在我找到了如下代码 我认为它会帮助我获取信息 但是我有一些疑问 首先我想知道应该将哪个库添加到我的程序中 然后什么是 pca
  • 如何将非静态类成员“std::bind”绑定到 Win32 回调函数“WNDPROC”?

    我正在尝试将非静态类成员绑定到标准WNDPROC http msdn microsoft com en us library ms633573 aspx功能 我知道我可以通过将类成员设为静态来简单地做到这一点 但是 作为一名 C 11 ST
  • ClickOnce 应用程序错误:部署和应用程序没有匹配的安全区域

    我在 IE 中使用 FireFox 和 Chrome 的 ClickOnce 应用程序时遇到问题 它工作正常 异常的详细信息是 PLATFORM VERSION INFO Windows 6 1 7600 0 Win32NT Common
  • 错误:表达式不产生值

    我尝试将以下 C 代码转换为 VB NET 但在编译代码时出现 表达式不产生值 错误 C Code return Fluently Configure Mappings m gt m FluentMappings AddFromAssemb
  • 使用 LINQ2SQL 在 ASP.NET MVC 中的各种模型存储库之间共享数据上下文

    我的应用程序中有 2 个存储库 每个存储库都有自己的数据上下文对象 最终结果是我尝试将从一个存储库检索到的对象附加到从另一个存储库检索到的对象 这会导致异常 Use 构造函数注入将 DataContext 注入每个存储库 public cl
  • 如何区分用户点击链接和页面自动重定向?

    拥有 C WebBrowser control http msdn microsoft com en us library system windows forms webbrowser aspx在我的 WinForms 应用程序中 并意识
  • 获取两个工作日之间的天数差异

    这听起来很简单 但我不明白其中的意义 那么获取两次之间的天数的最简单方法是什么DayOfWeeks当第一个是起点时 如果下一个工作日较早 则应考虑在下周 The DayOfWeek 枚举 http 20 20 5B1 5D 3a 20htt
  • 使用接口有什么好处?

    使用接口有什么用 我听说它用来代替多重继承 并且还可以用它来完成数据隐藏 还有其他优点吗 哪些地方使用了接口 程序员如何识别需要该接口 有什么区别explicit interface implementation and implicit
  • 回发后刷新时提示确认表单重新提交。我做错了什么?

    我有一个以空白 默认状态启动的仪表板 我让用户能够将保存的状态加载到仪表板中 当他们单击 应用 按钮时 我运行以下代码 function CloseAndSave var radUpload find radUpload1ID var in
  • 在 C 中初始化变量

    我知道有时如果你不初始化int 如果打印整数 您将得到一个随机数 但将所有内容初始化为零似乎有点愚蠢 我问这个问题是因为我正在评论我的 C 项目 而且我对缩进非常直接 并且它可以完全编译 90 90 谢谢 Stackoverflow 但我想
  • 如何在 32 位或 64 位配置中以编程方式运行任何 CPU .NET 可执行文件?

    我有一个可在 32 位和 64 位处理器上运行的 C 应用程序 我试图枚举给定系统上所有进程的模块 当尝试从 64 位应用程序枚举 32 位进程模块时 这会出现问题 Windows 或 NET 禁止它 我认为如果我可以从应用程序内部重新启动
  • 使用自定义堆的类似 malloc 的函数

    如果我希望使用自定义预分配堆构造类似 malloc 的功能 那么 C 中最好的方法是什么 我的具体问题是 我有一个可映射 类似内存 的设备 已将其放入我的地址空间中 但我需要获得一种更灵活的方式来使用该内存来存储将随着时间的推移分配和释放的
  • C#:帮助理解 UML 类图中的 <>

    我目前正在做一个项目 我们必须从 UML 图编写代码 我了解 UML 类图的剖析 但我无法理解什么 lt
  • 为什么 std::strstream 被弃用?

    我最近发现std strstream已被弃用 取而代之的是std stringstream 我已经有一段时间没有使用它了 但它做了我当时需要做的事情 所以很惊讶听到它的弃用 我的问题是为什么做出这个决定 有什么好处std stringstr
  • “接口”类似于 boost::bind 的语义

    我希望能够将 Java 的接口语义与 C 结合起来 起初 我用过boost signal为给定事件回调显式注册的成员函数 这非常有效 但后来我发现一些函数回调池是相关的 因此将它们抽象出来并立即注册所有实例的相关回调是有意义的 但我了解到的
  • 使用 %d 打印 unsigned long long

    为什么我打印以下内容时得到 1 unsigned long long int largestIntegerInC 18446744073709551615LL printf largestIntegerInC d n largestInte
  • System.IO.FileNotFoundException:找不到网络路径。在 Windows 7 上使用 DirectoryEntry 对象时出现异常

    我正在尝试使用 DirectoryEntry 对象连接到远程 Windows 7 计算机 这是我的代码 DirectoryEntry obDirEntry new DirectoryEntry WinNT hostName hostName
  • 无法接收 UDP Windows RT

    我正在为 Windows 8 RT 编写一个 Windows Store Metro Modern RT 应用程序 需要在端口 49030 上接收 UDP 数据包 但我似乎无法接收任何数据包 我已按照使用教程进行操作DatagramSock
  • Oracle Data Provider for .NET 不支持 Oracle 19.0.48.0.0

    我们刚刚升级到 Oracle 19c 19 3 0 所有应用程序都停止工作并出现以下错误消息 Oracle Data Provider for NET 不支持 Oracle 19 0 48 0 0 我将 Oracle ManagedData
  • 从列表中选择项目以求和

    我有一个包含数值的项目列表 我需要使用这些项目求和 我需要你的帮助来构建这样的算法 下面是一个用 C 编写的示例 描述了我的问题 int sum 21 List

随机推荐

  • 升级 haskell 堆栈使用的 ghc 版本

    我正在尝试将我为 haskell stack 安装的 ghc 版本从版本 8 0 2 更新到 8 2 1 但似乎我丢失了一些东西 user localhost stack resolver ghc 8 2 1 setup stack wil
  • 计算矩阵中一点与所有其他点之间的距离

    我是Python新手 我需要实现一个聚类算法 为此 我需要计算给定输入数据之间的距离 考虑以下输入数据 1 2 8 7 4 2 9 1 7 0 1 5 6 4 3 我希望在这里实现的是 我想计算 1 2 8 与所有其他点的距离 并找到距离最
  • 线程安全对象 - 静态还是非静态?

    我最近在接受采访 技术人员问我如何使应用程序线程安全 嗯 解释完之后lock 正确的是 他说让物体保持静态并不是一个好主意 private static readonly object syncLock new object 他声称原因是静
  • 使用 HTML5 数据属性的 CSS 值[重复]

    这个问题在这里已经有答案了 width attr data width 我想知道是否有任何方法可以使用 HTML5 设置 css 值data 属性的设置方式与设置 css 的方式相同content 目前它不起作用 HTML div div
  • JAXB 无法生成 XBRL 的 Java 类

    我正在尝试为 XBRL 中定义的类型生成 Java 类 我的构建过程基于 Maven 2 以下是我的试验 我只粘贴build部分 它依赖于一些属性 package是我的目标包的名称 catalog是目录的路径和文件名 因为我没有互联网连接
  • 以编程方式设置网页的默认缩放?

    是否可以在网站上设置默认缩放级别 例如 我可以编码吗my site比如当用户打开它时它会缩放到 125 我的网站主体有这个代码 如何把这个缩放代码放进去 Add zoom 125 到身体风格 body color 536482 backgr
  • 为什么人们将他们的文件命名为index.html?

    我看到很多人在他们的 HTML 文件中使用这个文件名 我想知道为什么 我对 HTML 有点陌生 我还没有学到太多东西 但是当我命名我的 HTML 文件时 我可以随意命名它们 当我搜索 HTML 示例时 我发现它们将其命名为index htm
  • paypal自适应支付IPN中的自定义字段

    我在我的网站中实施了自适应支付 首先 这是标准付款 所以我通过了custom表单中的参数 我在 IPN 中获取它 但我无法找到如何在自适应支付中传递此参数 Thanks Edit 根据 jackvsworld 在 PayPal Adapti
  • 亚音速快死了吗

    我对使用 SubSonic 很感兴趣 我已经下载了它并且到目前为止我很喜欢它 但是看看 github 和 googlegroups 上的活动 它似乎不是很活跃 看起来很像一个即将消亡的项目 tekpub 上没有关于它的视频 而且 Rob 这
  • 在 Kivy 中显示 numpy 数组

    首先 我对 kivy 完全陌生 所以我有点挣扎 我正在尝试在 kivy 窗口中显示 numpy 数组 到目前为止 我发现这应该使用纹理类 http kivy org docs api kivy graphics texture html 由
  • 在 pytorch 上使用 MC Dropout 测量不确定性

    我正在尝试在 Pytorch 上使用 Mc Dropout 实现贝叶斯 CNN 主要思想是 通过在测试时应用 dropout 并运行多次前向传递 您可以从各种不同的模型中获得预测 我发现了 Mc Dropout 的应用 但我真的不明白他们是
  • java 8 的字数统计

    我正在尝试在 java 8 中实现字数统计程序 但无法使其工作 该方法必须接受一个字符串作为参数并返回一个Map
  • 即时运行无法在 Android Studio 上运行,表示需要 Gradle 版本 2.10。我用的是2.10

    这是我得到的错误 Error Gradle version 2 10 is required Current version is 2 8 If using the gradle wrapper try editing the distri
  • 从右到左文本 HTML 输入

    对于我的网站 我需要提供阿拉伯语支持 其中一部分是提供输入文本框 当用户输入时 新字符必须附加到左侧 并且文本必须右对齐 将 css 属性设置为 text align right 不起作用 因为我无法让光标移至左侧并在那里添加字母 所以我删
  • @Configurable-Beans 无法在 Spring Boot 中与 JPA-EntityListener 一起使用

    我在 Spring Boot 应用程序中创建的自定义 jpa 实体侦听器遇到了一个奇怪的问题 我正在尝试使用弹簧 Configurable配置 EntityListener 的机制 如 Springs 中所示 AuditingEntityL
  • 将浮点数舍入为预定义点的规则网格

    我想将浮点数四舍五入到给定的精度 例如 0 051 i want to convert it to 0 1 0 049 i want to convert it to 0 0 0 56 i want to convert it to 0 6
  • TSQL - 无效的列名行号[重复]

    这个问题在这里已经有答案了 为什么这么说 Invalid Column Name 对于行号WHERE SELECT Id Name ROW NUMBER OVER ORDER BY Id AS RowNumber FROM Folks WH
  • 如何将 UITextView 的“委托”出口连接到实现 UITextViewDelegate 协议的类?

    如何将 UITextView 的 委托 出口连接到实现 UITextViewDelegate 协议的类 我似乎找不到例子在文档中 奇怪的是 UITextView 委托 出口有拖放界面的东西 就像你可以将它连接到另一个小部件但当然 我不想将它
  • 如何在 Kaminari 中为首页设置不同的页面大小?

    我想使用 Kaminari 对许多对象进行分页 但是 在第一页上 我还想显示一条通知 允许查看者创建自己的对象 从而减少可以在该页面上显示的对象数量 然而 指示的页数还应该考虑到该第一页包含较少的元素 假设对象是字母 a 到 z 第一页只能
  • 运行 GCC 预处理器非 C 文件

    我正在使用专有的开发环境来编译用以下语言编写的代码C 以及 IEC 61131 语言 为了C编译时 它使用 GCC 4 1 2 和以下构建选项 fPIC O0 g nostartfiles Wall trigraphs fno asm 编译