gpt4 book ai didi

c - 如何克服导致编译器错误的程序集不兼容性?

转载 作者:行者123 更新时间:2023-11-30 15:23:35 25 4
gpt4 key购买 nike

我正在使用 Visual Studio 维护一个为嵌入式平台设计的 C 项目。我正在尝试使用 Visual C 编译器来构建项目,在出现错误之前尽可能地进行构建,并在准备好后使用目标工具链重建它。通过这种方式,我可以使用 IDE 优于 native 、过时的目标 IDE 的功能。

当然,Visual C 编译器无法理解 native 编译器的所有代码功能,但我通过使用命令行 Defines 和 Undefs,以及使用 native 编译器的系统头文件,取得了相当令人满意的进展。

我现在遇到的问题是使用内联汇编。在一些系统头文件中,有一些使用内联汇编的代码片段,其形式为:

#define GET_COUNT(count) \
do {
__asm volatile ("r2 = CYCLES; \n" \
"r1 = CYCLES2; \n" \
"[%0] = r2; \n" \
"[%0+4] = r1; \n" \
: : "p" (&(count)) \
: "r1", "r2" ); \
} while (0)

我正在寻找一种方法让 MS C 编译器忽略 c2400有关组装说明的错误。它可以通过某种方式自动注释掉 __asm调用,或将其重命名为关键字,这将使编译器忽略它。然而,有一个要求是不对系统头本身的源代码进行任何更改

<小时/>

更新1:该宏的使用示例位于另一个系统头文件中:

static clock_t clock(void)
{
_cycle_t _cnt;
_GET_COUNT( _cnt );
return (clock_t) _cnt;
}

此代码会生成上述错误。

因此,我创建了一个包含临时函数定义的文件:

void temp_func(char *a)
{
return;
}

并在我定义的项目选项中 volatile=__asm=temp_func 。然后我使用强制包含文件选项来包含该文件。我的想法是这样,原来__asm volatile ("blah");将被映射到temp_func("blah")调用,因此不会对构建产生任何影响。

但是,现在我在使用宏时收到以下错误:

error C2143: syntax error : missing ')' before ':'

最佳答案

一种技术是使用 #define MSVC,然后使用 #ifdef MSVC ... #else ... #endif 提供替代代码。

另一种方法是将特定于平台的所有内容放在一个或多个单独的 .c 文件中。然后,当我想在 PC 上测试/证明代码时,编写尽可能最好的修补程序的其他版本。那么它将只是项目中包含的一个不同文件,并且目标代码中不会充斥着解决方法。

因此,您只需提供任何需要不同的文件的替代版本,而无需触及源代码。

关于c - 如何克服导致编译器错误的程序集不兼容性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28749756/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com