【问题标题】:Porting Issue: Pointer with offset in VC++移植问题:VC++ 中带有偏移的指针
【发布时间】:2010-09-17 06:35:07
【问题描述】:

好的,这在 Linux 下的 GCC 中编译得很好。

char * _v3_get_msg_string(void *offset, uint16_t *len) {/*{{{*/
    char *s;
    memcpy(len, offset, 2);
    *len = ntohs(*len);
    s = malloc(*len+1);
    memset(s, 0, *len+1);
    memcpy(s, offset+2, *len);
    s[*len] = '\0';
    *len+=2;
    return s;
}/*}}}*/

但是,由于线路原因,我在将其移植到 Windows 时遇到了问题...

memcpy(s, offset+2, *len);

作为 void 指针,VC++ 不想偏移指针。 CPP 不允许指针偏移的通常警告应该没有实际意义,因为整个项目是在 extern "C" 下构建的。

现在,这只是众多功能中的 1 个,找到问题的答案将使它们全部得到修复。我真的不想从头开始重写库项目,我不想在 MinGW 下构建。必须有一种方法可以做到这一点,我错过了,在 Google 中找不到。

【问题讨论】:

    标签: porting offset void-pointers


    【解决方案1】:

    嗯,你不能用 void* 做指针运算,这在 GCC 下编译是荒谬的。试试memcpy(s, ((char*)offset)+2,*len);

    【讨论】:

    • GCC 为标准 C 提供了许多扩展,包括许多非常有用的扩展。有关列表,请参阅gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_4.html。特别是,它允许对 void-pointers 进行指针运算:有关详细信息,请参阅 gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_4.html#SEC78。如果您使用 '-pedantic' 选项进行编译,它会警告您程序中的非标准结构。
    • 这很有效,TonyK 对他的评论很满意。它在 GCC 中被允许,并且有它的用途,但它不是很便携。
    • 嗯,有一些非常有用/有趣的扩展,但我会禁止这个。 :-)。 @TonyK 感谢您的链接。
    猜你喜欢
    • 1970-01-01
    • 2013-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多