【问题标题】:#include inside the main () function#include 在 main() 函数中
【发布时间】:2011-05-03 18:29:52
【问题描述】:

我想知道是否有可能在 C 的 main() 函数内部包含一些东西。

例如,在一个 Cell 程序中,我为 cache-api.h 定义了稍后在 main() 函数中我想要更改的参数。

我知道用#define 定义的内容可以在程序中的任何地方用#undef 取消定义,但是在重新定义我需要的参数之后,我必须再次包含cache-api.h。这可能吗?

我怎样才能更优雅地解决这个问题?假设我想使用 cache_rd(...) 从主存储中读取,但在 SPU 执行期间类型会有所不同,我如何在同一程序中同时使用 #define CACHED_TYPE struct x#define CACHED_TYPE struct y

提前感谢您的回答,我希望我表达清楚。

【问题讨论】:

  • 如果您想优雅地解决这个问题,请切换到面向对象的语言并在运行时使用多态性在两者之间进行选择。
  • 不幸的是我做不到,我在 Cell 中,我使用 C
  • 将您的程序分成不同的文件,并逐个文件本地化不同的定义。
  • 我不知道如何在 Cell 中使用 SPU 和 PPU.... 在 PPU 中我有这一行:extern spe_program_handle_t spu;如果我放 spu1,spu2,它会知道什么时候发送到 spu1,什么时候发送到 spu2?
  • 其实是个好主意...谢谢保罗!

标签: c cell


【解决方案1】:

#define#include 只是在编译的“预处理”阶段发生的文本操作,这在技术上是一个可选阶段。所以你可以以各种方式混合和匹配它们,只要你的预处理器语法正确,它就可以工作。

但是,如果您使用 #undef 重新定义宏,您的代码将难以理解,因为相同的文本在代码的不同位置可能具有不同的含义。

对于自定义类型typedef 在可能的情况下是首选,因为您仍然可以从编译器的类型检查机制中受益,并且它更不容易出错,因为它比#define 宏不太可能出现意外的副作用-对周围代码的影响。

【讨论】:

  • 我认为这是一个问题,因为它在主函数中指向我的#include 错误,然后是:函数'CACHE_cache_lock'的无效存储类...... (更多功能)..我能从中理解什么?
【解决方案2】:

是的,这很好(可能不是最明确的设计决定),但#include 就像将该文件复制并粘贴到#include 所在的代码中。

【讨论】:

    【解决方案3】:

    #define#include 是预处理器宏:http://en.wikipedia.org/wiki/C_preprocessor

    它们在编译之前被转换/内联。

    回答你的问题......不,你真的不想这样做,至少是为了下一个必须尝试解开这个烂摊子的人。

    【讨论】:

    • 那只回答第一个问题,第二个问如何更优雅地解决。
    • 但是当我真正需要的时候,我能做到吗?
    【解决方案4】:

    您可以在 any 文件中#include any 文件。那么它是否有效取决于文件的内容;具体来说,如果直接作为文本输入该内容是否有效。

    头文件通常包含通常仅在函数定义之外(或任何类型的编码结构之外)才有效的声明和结构——线索就在名称 header 文件中。否则,您可能会更改声明的范围,或者更可能使编译单元在语法上无效。

    为此目的专门编写的包含文件可能没问题,但不只是任意头文件。

    通用头文件应该包含保护以防止多次声明,因此除非您取消定义保护宏,否则重新包含头文件在任何情况下都不会产生任何影响。

    解决您的问题的一种可能方法是创建单独编译的模块(编译单元),其中包含您需要调用的 API 的包装函数。在定义适当的配置宏之后,每个编译单元都可以包含 API 头文件。然后,您将拥有由这些包装函数提供的两个独立的接口。

    【讨论】:

      猜你喜欢
      • 2013-03-11
      • 2012-05-11
      • 2019-04-25
      • 2011-12-16
      • 1970-01-01
      • 2021-12-24
      • 2016-01-28
      • 1970-01-01
      • 2012-01-27
      相关资源
      最近更新 更多