我相信你的问题的答案是否定的——但这是一种做类似事情的方法。
定义一个宏,并使用#
“字符串化”操作符来保证只有一个字符串字面量将被传递给函数(除非有人绕过宏并直接调用函数)。例如:
#include <iostream>
#define LOG(arg) Log(#arg)
void Log(const char *message) {
std::cout << "Log: " << message << "\n";
}
int main() {
const char *s = "Not this message";
LOG("hello world");
LOG(hello world);
LOG(s);
}
输出是:
Log: "hello world"
Log: hello world
Log: s
s
传递给的尝试LOG()
没有触发编译时诊断,但它没有将该指针传递给Log
函数。
这种方法至少有两个缺点。
一是它很容易被绕过;您可以通过在源代码中搜索对实际函数名称的引用来避免这种情况。
另一个是对字符串文字进行字符串化不仅会给您相同的字符串文字;的字符串化版本"hello, world"
是"\"hello, world\""
. 我想你的Log
函数可以去掉"
传递的字符串中的任何字符。您可能还想处理反斜杠转义;例如,"\n"
(包含换行符的 1 个字符的字符串)被字符串化为"\\n"
(包含反斜杠和字母的 2 个字符的字符串n
)。
但我认为更好的方法是不要依赖编译器来诊断带有字符串文字以外的参数的调用。只需使用其他工具扫描源代码以查找对您的Log
函数的调用,并报告第一个参数不是字符串文字的任何调用。如果您可以为调用强制执行特定布局(例如,标记Log
、(
和同一行上的字符串文字),那应该不会太难。