gpt4 book ai didi

c++ - MSVC (VS2015) 将 `char * const` 字段视为 "incompatible with C"

转载 作者:搜寻专家 更新时间:2023-10-31 02:10:32 26 4
gpt4 key购买 nike

我有以下代码在 VS2015 中编译时没有警告(启用所有警告):

// buffer.h

typedef struct {
char * const start; // start of the buffer
char * const end; // one byte after the end of the buffer
char * pos; // current position
} Buffer;

static inline Buffer Buffer_create(char *buffer, int size) {
Buffer b;

char ** const startPtr = &((char *)b.start);
char ** const endPtr = &((char *)b.end);

*startPtr = buffer;
*endPtr = buffer + size;
b.pos = buffer;

return b;
}

因为 .start.end 成员是 const,我正在做强制转换以避免收到编译警告,代码确实如此编译时没有警告,工作时没有问题。

但是,如果我想使用 gtest 对此进行测试,并且如果我想从 .cpp 文件中引用此文件:

// some_file.cpp

extern "C" {
#include "buffer.h"
}

我得到了 C4190 warning来自 Visual Studio,描述为:

'Buffer_create' has C-linkage specified, but returns UDT 'Buffer' which is incompatible with C

但是 UDT 显然“与 C 兼容”,因为我可以在没有警告的情况下构建它,直到我尝试从 cpp 文件中引用它。

如果我从 struct 定义中删除 const,警告就会消失。

因此,MSVC 似乎认为 char * const 不“与 C 兼容”。我是在做违法的事情,还是编译器错误?

最佳答案

根据 the documentation you linked对于警告 C4190,不支持具有从 C 和 C++ 调用的按值返回 struct 的函数。

(在 C++ 标准中,语言混合的大部分细节都是作为实现定义的,在这种情况下,MSVC 通过记录不支持来遵守)。

我也不建议在编译为 C 和 C++ 的 header 中使用 inline 函数,因为 inline 的语义在两种语言之间不同,因此它自找麻烦。

如果您想在两种语言中使用 Buffer_create,则必须对设计进行重大更改才能避免此问题。例如,通过指针输出参数“返回”结果,并取消 const 结构成员。

关于c++ - MSVC (VS2015) 将 `char * const` 字段视为 "incompatible with C",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45058667/

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