宏定义在MIPS和“英特尔C编译器”之间是否兼容?

宏定义在MIPS和“英特尔C编译器”之间是否兼容?,c,macros,mips,icc,C,Macros,Mips,Icc,我在C程序中定义的宏似乎有问题 我编译了这个软件,并用MIPS编译器成功地运行了它 它构建OK,但在运行时使用icc时抛出错误“分段错误” 我在64位体系结构(SGI上的MIPS,带-64标志,英特尔平台上的icc)上编译了这两个文件 是否有一些魔术开关,我需要使用,使这两个系统上的工作正常?我为英特尔编译器打开了警告,程序中调用宏的每个地方都会抛出警告。通常是宏参数(int-to-char*)上的类型不匹配或诸如此类的东西 下面是令人不快的宏 #define DEBUG_ENTER(name

我在C程序中定义的宏似乎有问题

我编译了这个软件,并用MIPS编译器成功地运行了它

它构建OK,但在运行时使用icc时抛出错误“分段错误”

我在64位体系结构(SGI上的MIPS,带-64标志,英特尔平台上的icc)上编译了这两个文件

是否有一些魔术开关,我需要使用,使这两个系统上的工作正常?我为英特尔编译器打开了警告,程序中调用宏的每个地方都会抛出警告。通常是宏参数(int-to-char*)上的类型不匹配或诸如此类的东西

下面是令人不快的宏

 #define DEBUG_ENTER(name) {tdepth++; 
 if(tnames[tdepth] == NULL) tnames[tdepth] = memalign(8, sizeof(char)*MAXLEN);
 strcopy(tnames[tdepth],name);
 FU_DEBUG("Entering \n");}
这基本上是用于调试-根据函数调用的数量打印到一个日志文件,其中包含一组选项卡。(tdepth=制表符深度)


我在手册页上做了一些检查。似乎只有IRIX支持memalign。这可能是我的问题。我将跟踪它。

这可能是字节顺序问题。MIPS可以是大端,但intel是小端。

这可能是字节顺序问题。MIPS可以是big-endian,但intel是little-endian。

这可能与系统的“endianness”有关。看起来,MIPS似乎具有可切换的endianness。我不确定你是否已经使用了正确的endianness,但如果你没有,你肯定会有问题。

这可能与系统的“endianness”有关。看起来MIPS似乎有可切换的endianness。我不确定您是否已经使用了正确的endianness,但是如果您没有,您肯定会遇到问题。

听起来数组
t名称
是一个
int
数组。如果要为它分配指针,它应该是指针类型的数组-在这种情况下,
char*
可能是合适的


(另外,
strcopy()
不是标准函数-你确定你的意思不是
strcopy()
?)

听起来数组
tnames
是一个
int
数组。如果要为它分配指针,它应该是指针类型的数组-在这种情况下,
char*
可能是合适的


(另外,
strcopy()
不是一个标准函数-你确定你的意思不是
strcopy()
?)

我想发布宏代码是不可能的?我会在几分钟后发布。它在不同的网络上。这取决于宏。宏只是扩展到指定的代码,而该代码可能不可移植。(在许多情况下,宏通常被用作特定于体系结构的代码的抽象层。)发布有问题的宏定义。处理它。是否也需要发布FU_DEBUG宏?如果您发布编译器发出的确切警告,
tnames
,将更容易看到发生了什么,还有一个宏调用的例子。我想发布宏代码是不可能的?我会在几分钟后发布。它在不同的网络上。这取决于宏。宏只是扩展到指定的代码,而该代码可能不可移植。(在许多情况下,宏通常被用作特定于体系结构的代码的抽象层。)发布有问题的宏定义。处理它。是否也需要发布FU_DEBUG宏?如果您发布编译器发出的确切警告,
tnames
,将更容易看到发生了什么,宏调用的一个例子。什么样的操作会受到影响?我没有做任何显式字节移位或任何事情。正常的系统调用(malloc、memset等,可以吗?)受影响的事情太多了,很难总结。系统调用应该可以,但其参数可能不可以。如果你能发布宏,我相信有人会很快指出问题。好的,首先跳出的是memalign()返回void*,并被分配给我认为是char*的对象。这就解释了国际刑事法院的警告。第二件事是您没有测试返回值以查看调用是否成功。在strcpy()之前再次检查NULL。memalign()也被认为是过时的。请尝试改用posix_memalign()。这会影响哪些操作?我没有做任何显式字节移位或任何事情。正常的系统调用(malloc、memset等,可以吗?)受影响的事情太多了,很难总结。系统调用应该可以,但其参数可能不可以。如果你能发布宏,我相信有人会很快指出问题。好的,首先跳出的是memalign()返回void*,并被分配给我认为是char*的对象。这就解释了国际刑事法院的警告。第二件事是您没有测试返回值以查看调用是否成功。在strcpy()之前再次检查NULL。memalign()也被认为是过时的。请尝试改用posix_memalign()。