c++ - 函数如何检测字符串指针与字符串文字参数?

标签 c++ string detect literals

我遇到过一个函数,这样可以区分被调用为

foo("bar");

对比

const char *bob = "bar";
foo(bob);

我想到的可能性是:

  • 字符串地址:两个参数都位于图像的 .rdata 部分。如果我在同一个程序中执行这两个调用,那么这两个调用都会收到相同的字符串地址。
  • RTTI:不知道如何使用 RTTI 来检测此类差异。

我能想到的唯一可行的例子是:

void foo(char *msg)
{
    printf("string literal");
}

void foo(const char *&msg)
{
    printf("string pointer");
}

foo("bar");                 // "string literal"

const char *soap = "bar";
foo(soap);                  // "string pointer"

我无权访问该函数的代码,头文件中的声明仅显示一个函数声明。

最佳答案

这是区分字符串文字和指针的另一种方法,基于字符串文字具有数组类型而非指针类型这一事实:

#include <iostream>

void foo(char *msg)
{
    std::cout << "non-const char*\n";
}

void foo(const char *&msg) // & needed, else this is preferred to the
                           // template function for a string literal
{
    std::cout << "const char*\n";
}

template <int N>
void foo(const char (&msg)[N])
{
    std::cout << "const char array reference ["<< N << "]\n";
}

int main() {
    foo("bar"); // const char array reference [4]
}

但请注意,所有这些(包括您的原始函数)都可以通过传递不是字符串文字的内容来“愚弄”:

const char *soap = 0;
foo(soap);

char *b = 0;
foo(b);

const char a[4] = {};
foo(a);

C++ 中没有字符串文字所特有的类型。因此,您可以使用类型来区分数组和指针,但不能区分字符串文字和另一个数组。 RTTI 是没有用的,因为 RTTI 只存在于至少有一个虚拟成员函数的类中。其他任何内容都取决于实现:标准中不保证字符串文字将占据任何特定的内存区域,或者在程序(甚至编译单元)中使用两次的相同字符串文字将具有相同的地址。在存储位置方面,实现可以对字符串文字执行的任何操作,也允许对我的数组 a 执行。

关于c++ - 函数如何检测字符串指针与字符串文字参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3577610/

相关文章:

vb.net - 检测单选按钮更改

c++ - OpenCV - 奇数 HSV 范围检测

c++ - 为什么类的 "Move"到 AppCode 中具有相同命名空间/名称.h 的文件导致空 .h 而所有类代码都移至 .cpp?

c++ - 将指向结构的指针转换为指向该结构的唯一成员的指针

c++ - CreateInstance 对象是否需要在析构函数中明确销毁?

c++ - 用来自另一个容器的迭代器填充一个容器

c++ - 从字符串 C++ 中读取单词,同时忽略空格、数字和符号。

jquery - 检测不透明度何时发生变化

ruby - 在 Ruby 中查找字符串中某个字符的 # 次出现

regex - 在文本之间不包含空格的匹配正则表达式是什么?