【问题标题】:What is the difference between '#include' and '##include'?“#include”和“##include”有什么区别?
【发布时间】:2017-05-16 14:19:01
【问题描述】:

例如:

#include "pathtoheader1/header1.hh"
##include "pathtoheader2/header2.hh"

这两个预处理指令有什么区别?

编辑

据我所知,在我正在使用的程序的上下文中,##include 指令会将 -I 标志添加到指定的包含路径。

TRICK_CFLAGS += -Imodels
TRICK_CXXFLAGS += -Imodels

编译器现在将寻找:

/models/pathtoheader1/header1.hh

而不是

/pathtoheader1/header1.hh

这些标志存储在 .mk 文件中。

其他信息

我正在使用 NASA 的 Trick Simulation 环境来构建一个简单的地球绕太阳运行的 2 体模拟。我正在使用的特定工具称为“trick-CP”,它是 Trick 的编译工具。

https://github.com/nasa/trick

【问题讨论】:

  • 第二个不行。
  • 您使用的是哪个编译器?这是 C 还是 C++?
  • 这不是一个直接的骗局,但它非常接近,What does ## mean for the C(C++) preprocessor?
  • @Bathsheba 这是 gcc 编译器。
  • 编辑您的问题并添加此信息,因为纯 C 和 C++ 没有此功能。

标签: c-preprocessor


【解决方案1】:

## 是 C 和 C++ 预处理器中的标记粘贴运算符。它用于连接两个参数。

由于它需要任何一方的参数,因此以它开头的行在语法上无效,除非它是前一行的延续,其中前一行使用了行继续符号 \ 或等效的三元组序列。

【讨论】:

  • 实际上,以## 开头的行在多行宏中可以在语法上有效。
  • @DAle:自然。
  • 小心@DAle,因为这里有多个适用的“线”定义。宏定义(实际上是所有预处理器指令)都完全包含在一个逻辑行上。从这个意义上说,没有任何多行宏。宏定义可以跨多个物理行分布的行延续在对输入文件进行标记之前被删除(好像),因此在使用预处理器之前。
【解决方案2】:

问题是关于 NASA Trick 的。 Trick 用自己的语法扩展了 C 和 C++ 语言。

来自技巧documentation

为用户定义的模型提供数据类型的头文件应该使用 ##include 包含在内。请注意双井号 (#)。

【讨论】:

  • 我没有意识到 ##include 是一种特定于 Trick 的语法。谢谢。
【解决方案3】:

第二个是 C++ 中的语法错误,我很确定它也是 C 中的语法错误。 ## 预处理器运算符仅在预处理器宏内有效(它强制粘贴令牌)。

【讨论】:

    猜你喜欢
    • 2010-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多