【问题标题】:extern followed by string literalextern 后跟字符串文字
【发布时间】:2015-09-08 12:12:52
【问题描述】:

我正在尝试使用 pycparser 解析 C 文件的语法。我通过预处理器发送 C 文件,然后将预处理器的输出发送给 pycparser 解析。以下代码在其中一个 C 文件中...

extern "asm"
{
    extern void ASM_Function(void);
}

pycparser throws 和异常告诉我这是无效的 C 语法。查看C BNF 关键字extern 不允许在其前面出现字符串文字。我在阅读 BNF 时是正确的吗?这个外部功能是在更高版本的 C 中添加的,还是这个语法编译器特定的?

【问题讨论】:

  • 确定不是C++ code?但是,可能会有一个具有这种扩展名的 C 编译器。
  • asm 不代表汇编级代码吗? asm volatile(@assembler funtion);?
  • @cremno 编译器程序同时支持 C 和 C++ 代码,但我指定了运行时标志只使用 C 编译器。它可能是一个扩展,允许程序员在中链接程序集

标签: c syntax bnf pycparser


【解决方案1】:

它看起来像一个编译器扩展。你知道代码最初是为哪个编译器编写的吗?

大多数编译器都支持通过将函数声明包装为以下内容来声明 C 调用约定:

#ifdef __cplusplus
extern "C" {
#endif

    // functions that use C calling convention.
    // are declared here.

#ifdef __cplusplus
} /* extern "C" */
#endif

代码似乎声明了一个名为 ASM_Function 的外部定义的汇编函数。如果您知道汇编函数期望的调用约定是什么,则可以重写它。

extern "C" 是一个 C++ 构造,用于声明不使用名称修饰并将使用 cdecl 调用约定的函数。

编辑:更正了我的帖子。

【讨论】:

  • extern "C" 是 C++ 的东西。 C 和 C++ 编译器使用的头文件使用 ifdef,例如#ifdef __cplusplus 对 C 编译器隐藏 extern "C"
  • 是的,这是正确的,但是想要与 C++ 编译器兼容的 C 头文件仍然可以与 C 编译器一起使用。现代 C 编译器在其语法中意识到了这一点。
  • @ManVsCode:问题是预处理器隐藏了extern "C",所以它甚至不被C编译器看到,这会在extern "C"时严重崩溃。
  • 啊,是的。这是正确的!我忘记了它周围的#ifdef。
  • @DarthSpeedious 有两种方法可以混合 C 和 Assembly。第一种方法是将汇编代码内联到 C 函数中。这取决于使用特殊的编译器扩展,并且如何做到这一点因编译器而异。第二种方法是使用您的 C 二进制文件将使用的相同二进制格式(ELF、COFF 等)编译您的程序集代码,将您的程序集对象与您的 C 对象链接,最后,使用正确的从您的 C 代码中调用它编写汇编代码的调用约定。
猜你喜欢
  • 2021-08-17
  • 2013-10-31
  • 2015-02-17
  • 2021-02-07
  • 2016-08-09
  • 1970-01-01
  • 2020-09-30
  • 1970-01-01
  • 2023-03-30
相关资源
最近更新 更多