为什么__FUNCTION__是undefined ?
Why would __FUNCTION__ be undefined?
我有一个c++库,通过crtdefs.h使用预定义的宏__FUNCTION__
。这里记录了这个宏。以下是我的用法:
my.cpp
#include <crtdefs.h>
...
void f()
{
L(__FUNCTIONW__ L" : A diagnostic message");
}
static void L(const wchar_t* format, ...)
{
const size_t BUFFERLENGTH = 1024;
wchar_t buf[BUFFERLENGTH] = { 0 };
va_list args;
va_start(args, format);
int count = _vsnwprintf_s(buf, BUFFERLENGTH, _TRUNCATE, format, args);
va_end(args);
if (count != 0)
{
OutputDebugString(buf);
}
}
crtdefs.h
#define __FUNCTIONW__ _STR2WSTR(__FUNCTION__)
该库(如果需要的话,它被编译为静态库)由同一解决方案中的另一个项目使用,一个用c#编写的WPF应用程序。
当我编译这个库时,我得到这个错误:
标识符"L__FUNCTION__"未定义。
根据文档,如果/p或/EP传递给编译器,宏不会展开。我已经证实他们不是。是否有其他情况下该宏不可用?
您列出的错误如下:
identifier "L__FUNCTION__" is undefined.
注意这里没有定义" L__FUNCTION__
",而不是" __FUNCTION__
"。
不要在代码中使用__FUNCTIONW__
。微软没有在你链接的页面中记录这些,他们记录了__FUNCTION__
。你不需要加宽__FUNCTION__
。
ETA:我还注意到,您没有将该字符串分配给任何东西或在f()
中以任何方式打印它。
就用
L(__FUNCTION__ L" : A diagnostic message");
当相邻的字符串字面值组合在一起时,如果其中任何一个组件是。
使用L
作为函数名并没有什么问题…然而,这是毫无意义的。好的变量和函数标识符应该是描述性的,以帮助读者理解代码。但是编译器并不在乎。
因为你的L
函数包装了vsprintf,你也可以使用:
L(L"%hs : A diagnostic message", __func__);
由于__func__
被标准化为窄字符串,因此%hs
格式说明符是合适的。
该规则见于2.14.5p13:
在翻译阶段6(2.2)中,相邻的字符串字面值被连接起来。如果两个字符串字面值具有相同的编码前缀,则结果连接的字符串字面值具有该编码前缀。如果一个字符串字面值没有编码前缀,它将被视为与另一个操作数具有相同编码前缀的字符串字面值。如果UTF-8字符串文字标记与宽字符串文字标记相邻,则程序格式错误。任何其他连接都有条件地支持实现定义的行为。
我认为__FUNCTIONW__
的定义是不正确的。(我知道这不是你写的。)
从:http://gcc.gnu.org/onlinedocs/gcc/Function-Names.html
这些标识符不是预处理器宏。在GCC 3.3及更早的版本中,仅在C语言中,
__FUNCTION__
和__PRETTY_FUNCTION__
被视为字符串文字;它们可以用来初始化char数组,它们可以与其他字符串字面值连接。GCC 3.4及以后的版本它们作为变量,如__func__
。在c++中,__FUNCTION__
和__PRETTY_FUNCTION__
一直是变量
至少在当前的GCC中,你不能将L
添加到__FUNCTION__
中,因为这就像试图将L
添加到变量中一样。可能有一个版本的vc++(就像GCC一样)可以工作,但是你没有使用那个版本。
- "error: no matching function for call to"构造函数错误
- 调用专用模板时出错"no matching function for call to [...]"
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- Visual Studio Code "undefined reference to `WinMain@16'"
- 库函数需要一个 std::function<void(void)>,如何传入类函数?
- Confusion: decltype vs std::function
- 使用 MATLAB 编码器生成C++代码:编译错误"undefined reference to `rgb2gray_tbb_real64'"
- 为什么 std::function 可以作为 std::not2 的参数?
- 'max'匹配'std::function<const int &(const int &, const int &)>'无过载
- 传递给std::function template的template参数究竟代表什么
- "Undefined class"作为is_base_of的论据
- 为什么创建友元类的实例会导致"undefined reference to"错误?
- 将带有unique_ptr的可变 lambda 传递给 const&std::function
- 绑定派生类方法C++从实例范围之外的分隔 std::function 变量调用
- Vector, assign() function Undefined Behavior
- C++ "undefined reference to class::function"
- 我收到错误:"in function main: undefined reference to Fraction::Fraction()"
- 清"undefined reference to function"
- 在我的C++游戏中出现"undefined reference to class::function"错误。
- 使用 llvm::Function::d ump(),链接器可以"undefined reference to `llvm::Value::dump() const'"