我们的项目使用宏来使单行语句中的日志记录变得简单和简单,如下所示:
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中使用枚举类型变量作为字符串的简单方法?
除了手动方式之外,是否有任何将用户输入字符串转换为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)
谢谢
我对RTTI知之甚少,但我相信,由于你可以在运行时检索变量的名称.是否可以检索线程当前正在运行的函数的名称?
#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)