C++ don';“我不明白。”;“两阶段名称查找”;

C++ don';“我不明白。”;“两阶段名称查找”;,c++,C++,我有一个全局宏,它提供日志记录功能#define LOG_LOG(name,level,msg,…){我通过另一个宏LENTER使用日志记录功能,该宏间接调用/依赖LOG_LOG(定义如下)。宏看起来像这样(在logger.h中定义): #定义日志(名称、级别、消息等){\ #如果已定义(OS_MACOSX)\#定义日志\u日志(名称、级别、消息等){\ #如果已定义(OS_MACOSX)\,则应将宏重写为以下内容: #if defined(OS_MACOSX) #define THREAD_I

我有一个全局宏,它提供日志记录功能
#define LOG_LOG(name,level,msg,…){
我通过另一个宏
LENTER
使用日志记录功能,该宏间接调用/依赖
LOG_LOG
(定义如下)。宏看起来像这样(在
logger.h
中定义):

#定义日志(名称、级别、消息等){\
#如果已定义(OS_MACOSX)\
#定义日志\u日志(名称、级别、消息等){\

#如果已定义(OS_MACOSX)\,则应将宏重写为以下内容:

#if defined(OS_MACOSX)
#define THREAD_ID mach_thread_self()
#elif defined(OS_LINUX)
#define THREAD_ID syscall(__NR_gettid)
#elif defined(OS_FREEBSD)
#define THREAD_ID reinterpret_cast<int64>(pthread_self())
#endif

#define LOG_LOG(name,level,msg,...) do {      \
    int64 tid = THREAD_ID;                    \
    if (level<=LOGLEVEL_WARNING) {            \
       ...                                    \
 } while(0)
#如果已定义(OS_MACOSX)
#定义螺纹ID马赫螺纹自身()
#elif已定义(OS_LINUX)
#定义线程\u ID系统调用(\u\u NR\u getId)
#定义的elif(OS_FREEBSD)
#定义线程ID重新解释类型转换(pthread\u self())
#恩迪夫
#定义日志(名称、级别、消息等){\
int64 tid=线程ID\

如果(level您应该将宏重写为以下行:

#if defined(OS_MACOSX)
#define THREAD_ID mach_thread_self()
#elif defined(OS_LINUX)
#define THREAD_ID syscall(__NR_gettid)
#elif defined(OS_FREEBSD)
#define THREAD_ID reinterpret_cast<int64>(pthread_self())
#endif

#define LOG_LOG(name,level,msg,...) do {      \
    int64 tid = THREAD_ID;                    \
    if (level<=LOGLEVEL_WARNING) {            \
       ...                                    \
 } while(0)
#如果已定义(OS_MACOSX)
#定义螺纹ID马赫螺纹自身()
#elif已定义(OS_LINUX)
#定义线程\u ID系统调用(\u\u NR\u getId)
#定义的elif(OS_FREEBSD)
#定义线程ID重新解释类型转换(pthread\u self())
#恩迪夫
#定义日志(名称、级别、消息等){\
int64 tid=线程ID\

if(level)这不是一个名称查找问题,而是一个预处理器问题(在任何模板内容快速进入之前很久)。编译器本身不应该看到LOG\u LOG,只应该看到被替换的代码。您的编译器看到了为预处理器定义的符号?这是一个智能编译器。您收到了一个编译器错误,这意味着预处理器没有对
LOG\u LOG
执行任何操作,这意味着它看不到其定义。您可以构造最小的tes吗t-case?谢谢你的评论,我只是在问题中添加了更多的上下文,包括影响宏定义。如果编译器抱怨
LOG\u LOG
,这意味着预处理器没有用它的内容替换它。要么宏不可用,要么你有其他问题。运行预处理器,看看输出结果如何当然是。这不是名称查找问题,而是预处理器问题(在任何模板内容快速进入之前很久)。编译器本身不应该看到LOG\u LOG,只应该看到被替换的代码。您的编译器看到了为预处理器定义的符号?这是一个智能编译器。您收到了一个编译器错误,这意味着预处理器没有对
LOG\u LOG
执行任何操作,这意味着它看不到其定义。您可以构造最小的tes吗t-case?谢谢你的评论,我只是在问题中添加了更多的上下文,包括影响宏定义。如果编译器抱怨
LOG\u LOG
,这意味着预处理器没有用它的内容替换它。要么宏不可用,要么你有其他问题。运行预处理器,看看输出结果如何当然是这样。谢谢大卫,这是正确的,我搞乱了宏的嵌套,因此OP。现在一切正常,“两阶段名称查找”与此没有直接关系。谢谢大卫,这是正确的,我搞乱了宏的嵌套,因此OP。现在一切正常,“两阶段名称查找”与此没有直接关系。
/Users/bravegag/code/fastcode_project/code/src/vector.h: In member function 'void tvector<T>::random()':
/Users/bravegag/code/fastcode_project/code/src/vector.h:223:2: error: there are no arguments to 'LOG_LOG' that depend on a template parameter, so a declaration of 'LOG_LOG' must be available [-fpermissive]
/Users/bravegag/code/fastcode_project/build_debug$ g++ --version
g++ (MacPorts gcc46 4.6.3_2) 4.6.3
Copyright (C) 2011 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

/Users/bravegag/code/fastcode_project/build_debug$ uname -a
Darwin Macintosh-4.local 11.4.0 Darwin Kernel Version 11.4.0: Mon Apr  9 19:32:15 PDT 2012; root:xnu-1699.26.8~1/RELEASE_X86_64 x86_64
#define LOG_LOG(name,level,msg,...) { \
    #if defined(OS_MACOSX)\                  <--------------- Heh?
    int tid=mach_thread_self();\
    #elif defined(OS_LINUX)\
    int tid=syscall(__NR_gettid);\
    #elif defined(OS_FREEBSD)\
    int tid=reinterpret_cast<int64>(pthread_self());\
    #endif\
#if defined(OS_MACOSX)
#define THREAD_ID mach_thread_self()
#elif defined(OS_LINUX)
#define THREAD_ID syscall(__NR_gettid)
#elif defined(OS_FREEBSD)
#define THREAD_ID reinterpret_cast<int64>(pthread_self())
#endif

#define LOG_LOG(name,level,msg,...) do {      \
    int64 tid = THREAD_ID;                    \
    if (level<=LOGLEVEL_WARNING) {            \
       ...                                    \
 } while(0)