相关疑难解决方法(0)

我可以使用流操作符重写日志宏以使用C++模板函数吗?

我们的项目使用宏来使单行语句中的日志记录变得简单和简单,如下所示:

DEBUG_LOG(TRACE_LOG_LEVEL, "The X value = " << x << ", pointer = " << *x);
Run Code Online (Sandbox Code Playgroud)

宏将第二个参数转换为stringstream参数,并将其发送到常规C++记录器.这在实践中非常有用,因为它使多参数记录语句非常简洁.然而,斯科特·迈尔斯说,在有效的C++第3版,(第2项)"您可以通过使用一个内联函数模板获得的宏所有的效率加上所有常规函数的可预测的行为和类型安全".我知道在C++中与可预测行为相关的宏用法有很多问题,所以我试图在代码库中尽可能多地消除宏.

我的日志宏定义类似于:

#define DEBUG_LOG(aLogLevel, aWhat) {  \
if (isEnabled(aLogLevel)) {            \
  std::stringstream outStr;            \
  outStr<< __FILE__ << "(" << __LINE__ << ") [" << getpid() << "] : " << aWhat;    \
  logger::log(aLogLevel, outStr.str());    \
}
Run Code Online (Sandbox Code Playgroud)

我已多次尝试将其重写为不使用宏的内容,包括:

inline void DEBUG_LOG(LogLevel aLogLevel, const std::stringstream& aWhat) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

和...

template<typename WhatT> inline void DEBUG_LOG(LogLevel aLogLevel, WhatT aWhat) {
    ...  }
Run Code Online (Sandbox Code Playgroud)

无济于事(以上两个重写都不会在第一个例子中编译我们的日志代码).还有其他想法吗?可以这样做吗?或者最好把它留作宏?

c++ macros effective-c++

8
推荐指数
2
解决办法
3537
查看次数

C:将字符串映射到ENUM

可能重复:
在C中使用枚举类型变量作为字符串的简单方法?

除了手动方式之外,是否有任何将用户输入字符串转换为ENUM值的优雅方式是直接C.

调用以ENUM作为参数的函数的简化示例:

enum = {MONDAY,TUESDAY,WEDNESDAY};

...

//Get user to enter a day of the week from command line
...

//Set the work day according to user input
if (strcmp(user_input,"MONDAY")==0){
   SET_WORK_DAY(MONDAY);
} else if (strcmp(user_input,"TUESDAY")==0){
  SET_WORK_DAY(TUESDAY);
}
...
Run Code Online (Sandbox Code Playgroud)

谢谢

c

7
推荐指数
1
解决办法
1万
查看次数

是否有可能在C++中获取当前(成员)函数名称?

我对RTTI知之甚少,但我相信,由于你可以在运行时检索变量的名称.是否可以检索线程当前正在运行的函数的名称?

c++

4
推荐指数
1
解决办法
438
查看次数

C++宏乘法发生了什么

#define MAX 265

std::cout << 0 * MAX << std::endl; //to my surprise, the output is 9 rather than 0
Run Code Online (Sandbox Code Playgroud)

这个C++宏乘法有什么问题?

编辑:

以下是完整版本.

#include <stdio.h>
#include <string.h>
#include <iostream>

#define NAME_BYTES 256
#define VERSION_BYTES 256
#define SIZE_BYTES 32
#define USED_LOCK_COUNT_BYTES 32
#define LOCK_NAME_BYTES 256
#define LOCK_TYPE_BYTES 1
#define PID_BYTES 4
#define TID_BYTES 4
#define LOCK_BYTES LOCK_NAME_BYTES + LOCK_TYPE_BYTES + PID_BYTES + TID_BYTES 
#define HEADER_BYTES NAME_BYTES + VERSION_BYTES + SIZE_BYTES + USED_LOCK_COUNT_BYTES

int main() {
  std::cout << "LOCK_BYTES: " << …
Run Code Online (Sandbox Code Playgroud)

c++ macros multiplication

2
推荐指数
4
解决办法
3004
查看次数

标签 统计

c++ ×3

macros ×2

c ×1

effective-c++ ×1

multiplication ×1