如何在代码中识别 const char* 和 const char[] 的类型

How to identify the type of const char* and const char[] in code?

本文关键字:char const 类型 代码 识别      更新时间:2023-10-16
const char* s1   = "teststirg";  
const char  s2[] = "teststirg";

我想要一个方法告诉我 s1 是"char*",s2 是"char[]",如何编写方法?

使用模板:

template<typename T, unsigned int SIZE>
bool IsArray (T (&a)[SIZE]) { return true; }
template<typename T>
bool IsArray (T *p) { return false; }

这将在运行时进行评估。
用法:

if(IsArray(s1))
...
if(IsArray(s2))
...

如果有兴趣,您可以使用一些高级技术,这些技术将告诉您这是编译时。

编辑

typedef char (&yes)[2];
template<typename T, unsigned int SIZE>
yes IsArray (T (&a)[SIZE]);
template<typename T>
char IsArray (T *p);

用法:

if(sizeof(IsArray(s1)) == sizeof(yes))
...
if(sizeof(IsArray(s2)) == sizeof(yes))
...

如果您可以访问原始定义,则可以使用typeid(但我不知道是为了什么(。 如果您无权访问原始定义... 无法知道char*是从另一个char*还是从数组初始化的。

在上面的上下文中(这与我们有声明的方法相同(,

   /*1*/ s1[0]='';
   /*2*/ s2=s1;
   /*3 Only This is valid*/  s1=s2;
   /*4*/  s2[0]='';

编译器不允许步骤 1、2、4 通过,而步骤 3 会成功。这清楚地表明了变量的性质。现在,关于确定的方法(函数调用(,无论如何您都必须在方法签名中具有定义,因此我看不到此方法的任何目的/实用程序/可能性。

determiner (const char* s1,const char *const s2)

签名中已有定义。您需要绕过编译器才能获得用例。很抱歉,如果我没有正确满足您的要求。