簡體   English   中英

檢測此可變可用性

[英]Detect this variable availability

我目前正在調整Windows C ++項目以使其在Linux上運行。 我定義了幾個宏來將格式化的行打印到日志文件中。 它們類似於printf,所以我可以這樣寫:

WARN("%d::%s<", 42, "baz");

打印類似的東西很容易:

[thread_id] [WARN] [/ path / to / main.cpp:15] [星期五03/01/2019 10:38:54.408] [this_value] 42 :: baz <

this_value是如果是沒有定義(靜電功能,外部的“C”函數)的這個或NULL值。

我當前的代碼是:

#if defined(_WIN32) && !defined(__INTELLISENSE__)
    #define SET_ZIS __if_exists (this) { zis = this; }
#else
    #define SET_ZIS
#endif

#define _LOG(...) \
    do \
    { \
        void *zis = NULL; \
        SET_ZIS \
        GetLoggerInstance()->logMessage(__VA_ARGS__); \
    } while(0)

#define LOG(...) _LOG(level, __FILE__, __LINE__, __func__, zis, __VA_ARGS__)
#define WARN(...) LOG(ILogger_level::LEVEL_WARN, __VA_ARGS__)

有沒有檢測這種情況是否存在的標准方法? 也許使用std::is_*或SFINAE技巧?

我使用外部的“ C”函數構造對象(“ this”毫無意義)並調用實例化對象(“ this”有意義)。 “構造函數”在共享對象中導出,並由C ++項目動態使用。 這樣,我就不必管理名稱混亂的名稱。

extern "C" int CreateMyClass(std::shared_ptr<MyClass> *newClass);
int CreateMyClass(std::shared_ptr<MyClass> *newClass)
{
  RELAY("(%p)", newClass);
  *newClass = std::make_shared<MyClass>(42, "baz");
  return 0;
}

MyClass::MyClass(int a, char *b)
{
  RELAY("(%d,%s)", a, b);
}

編輯:這是一個簡單的測試用例:

#include <memory> /* For std::shared_ptr */
#define RELAY(...) printf("[%p][%s]\n", this, __func__)

class MyClass
{
public:
  MyClass(int a, const char *b);
  static void test();
};

extern "C" int CreateMyClass(std::shared_ptr<MyClass> *newClass);
int CreateMyClass(std::shared_ptr<MyClass> *newClass)
{
  RELAY("(%p)", newClass);
  *newClass = std::make_shared<MyClass>(42, "baz");
  return 0;
}

MyClass::MyClass(int a, const char *b)
{
  RELAY("(%d,%s)", a, b);
}

void MyClass::test()
{
  RELAY("()");
  printf("some work");
}

int main(int argc, char **argv)
{
  std::shared_ptr<MyClass> newClass;

  int ret = CreateMyClass(&newClass);
  MyClass::test();
  return ret;
}

g ++給出以下錯誤:

test.c: In function ‘int CreateMyClass(std::shared_ptr<MyClass>*)’:
test.c:2:41: error: invalid use of ‘this’ in non-member function
 #define RELAY(...) printf("[%p][%s]\n", this, __func__)
                                         ^
test.c:14:3: note: in expansion of macro ‘RELAY’
   RELAY("(%p)", newClass);
   ^~~~~
test.c: In static member function ‘static void MyClass::test()’:
test.c:2:41: error: ‘this’ is unavailable for static member functions
 #define RELAY(...) printf("[%p][%s]\n", this, __func__)
                                         ^
test.c:26:3: note: in expansion of macro ‘RELAY’
   RELAY("()");
   ^~~~~

CreateMyClass不是靜態的(“非成員函數”),因此不可用。 靜態函數也是如此。

this引用僅存在且始終存在於c ++類/結構的非靜態成員函數中。 它是一個函數正在操作的類實例的內存地址的指針。 就日志記錄而言,除了挖掘內存轉儲之外,我不確定您將如何使用它,並且我不確定100%的實例地址甚至對此有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM