相关疑难解决方法(0)

为什么C不允许从char**到const char*const*(和C++)的隐式转换?

我知道,从隐式转换char **const char **无法做到的,为什么,而且转化为char *const *作品.请参阅底部以获取有关该说明的链接.

除了一件特别的事情外,这一切都是有道理的 所以我有以下代码:

#include <stdio.h>

void
print(const char *const*param)
{
    printf("%s\n", param[0]);
}

int
main(int argc, char **argv)
{
    print(argv);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果我将其编译为C++代码,它编译得非常好.但是,如果相同的代码仅编译为C代码,我会收到错误(好吧,警告,但我们假设-Werror,即将警告视为错误).

GCC:

test.c: In function ‘main’:
test.c:12:11: warning: passing argument 1 of ‘print’ from incompatible pointer type [-Wincompatible-pointer-types]
     print(argv);
           ^
test.c:4:1: note: expected ‘const char * const*’ but argument is of type ‘char **’
 print(const char *const*param)
 ^
Run Code Online (Sandbox Code Playgroud)

铛:

test.c:12:11: warning: passing 'char **' …
Run Code Online (Sandbox Code Playgroud)

c c++ gcc const clang

15
推荐指数
1
解决办法
1219
查看次数

reinterpret_cast - 奇怪的行为

我遇到了与reinterpret_cast相关的奇怪错误.看看下面的代码:

int* var;
reinterpret_cast<void const **>(&var);
Run Code Online (Sandbox Code Playgroud)

VSC++ 2010中的错误:错误C2440:'reinterpret_cast':无法从'int**'转换为'const void**'

gcc 4.1.2中的错误:从'int**'类型的reinterpret_cast到'const void**'的类型转换为constness

gcc中的错误4.6.2:从类型'int**'的reinterpret_cast到'const void**'的类型转换掉了限定符

有没有人知道为什么编译器说我正在抛弃const.我,我的几个同事都不知道它有什么问题.

感谢帮助!

c++ casting const reinterpret-cast

4
推荐指数
1
解决办法
4296
查看次数

说明:将 'char **' 转换为 'const char **',转换丢失限定符

可能的重复:
从 char** 到 const char** 的隐式转换

鉴于以下代码:

void foo( const char ** buffer );

void bar() 
{
    char * buffer;
    foo( &buffer );
}
Run Code Online (Sandbox Code Playgroud)

为什么如果foo()函数有一个const char *参数编译器在传入一个char *变量时不会抱怨?但是在使用时char **,它不能将其转换为const char **? 编译器是否const在前一种情况下添加任何限定符?

我已经阅读了 C++ 标准的第 4.4 节,这让我更加困惑。

c++ casting constants

3
推荐指数
1
解决办法
2093
查看次数

如何在C++中声明指向常量的指针?

我正在尝试编写一个函数来解析命令行参数.这是函数声明:

void parse(int, char const **);
Run Code Online (Sandbox Code Playgroud)

为以防万一,我也尝试过(const char)**,const char **cchar **使用typedef const char cchar.但是,如果我将一个char **函数传递给函数,所有这些(如预期的那样,因为它们应该都是相同的)会导致错误,如:

void main(int argc, char **argv) {
    parse(argc, argv);
Run Code Online (Sandbox Code Playgroud)

我从GNU编译器获得的错误是error: invalid conversion from 'char**' to 'const char**'来自Clang的错误candidate function not viable: no known conversion from 'char **' to 'const char **' for 2nd argument.

我已经看到这样的解决方案被建议为声明一个指向char(const char * const *)的const指针的指针,但我不希望任何指针都是const因为我希望能够修改指针,所以我可以迭代一个参数使用for(; **argv; ++*argv).如何声明"指向const char的非const指针的非const指针"?

c++ pointers

3
推荐指数
2
解决办法
146
查看次数

标签 统计

c++ ×4

casting ×2

const ×2

c ×1

clang ×1

constants ×1

gcc ×1

pointers ×1

reinterpret-cast ×1