【发布时间】:2012-11-23 08:07:22
【问题描述】:
我想写一个只接受字符串字面量作为参数的 C++11 函数:
void f(const char* s) { static_assert(s is a string literal); ... }
即:
f("foo"); // OK
char c = ...;
f(&c); // ERROR: Doesn't compile
string s = ...;
f(s.c_str()); // ERROR: Doesn't compile
etc
有没有办法实现这个?该函数的签名可以更改,添加宏或任何其他语言功能的使用也是如此。
如果这不可能,那么最接近的近似值是多少? (无论如何,用户定义的文字可以提供帮助吗?)
如果没有,GCC 4.7 / Linux 中是否有特定于平台的方式?
【问题讨论】:
-
这是不可能的,因为字符串文字只是
char const[N]数组,因此与它们无法区分。 -
@AndrewTomazos-Fathomling 即使您确实传递了字符串文字,也无法保证。示例:
#include <stdio.h>/void f(const char *s) { printf(s); }/int main() { f("Hello, world!\n"); }只会导致"Hello, world!"(没有'\n')在我的系统上的快速测试中出现在可执行文件中。 -
@AndrewTomazos-Fathomling 我的可执行文件中出现的不是我的字符串文字。这是我的字符串文字的一些位(在这种情况下是大多数位),但不是全部。我可以将
f更改为什么都不做,忽略它的参数,然后可执行文件中不会出现任何位。 -
@AndrewTomazos-Fathomling:关于
printf的警告主要在 GCC 编译器内部实现(部分在 Glibc 头文件中通过适当的__attribute__注释实现)。所以你需要扩展 GCC 来做类似的检查。看我的回答。 -
@AndrewTomazos-Fathomling 因此,您实际上并不关心字符串文字是否出现在应用程序图像中。我的 cmets 基于此,我的第二条评论是对您的“目标是强制在调用点将字符串逐字输入代码,并静态编译到应用程序映像中”的回复。在这种情况下,我将重新表述我的第一个问题:其他情况如何,即不直接传递字符串文字,但也不在运行时计算字符串?指向字符串文字的指针/引用、简单的
const char array[]等?