请考虑以下代码:
void Foo() {
......
LOG_ERROR("I'm error 1") // call 1
.....
LOG_ERROR("I'm error 2") // call 2
.....
}
Run Code Online (Sandbox Code Playgroud)
LOG_ERROR()是一个宏.LOG_ERROR()应该打印字符串在代码中识别它,而假设代码可以改变,但A::Foo()
将保持不变.代码更改时,标识符应保留.
这可以通过添加错误代码作为参数来解决LOG_ERROR(),但我们希望从程序员中删除管理错误代码的负担.
使用__LINE__不是答案,因为Foo()可以从构建移动到构建.
因此,我想到了LOG_ERROR()相对于开始的
识别Foo():
__FILE__)+函数名称(__FUNCTION__)+ LOG_ERROR()相对于Foo()开始的行号来标识.__FILE__)+函数名称(__FUNCTION__)+
LOG_ERROR()电话号码识别Foo().该解决方案至少应该适用于VC++ 2008和g ++ 4.1.1.
一个建议的解决方案(链接文本)是:
#define ENABLE_LOG_ERROR static const int LOG_ERROR_start_line = __LINE__
#define LOG_ERROR(s) cerr << "error #" …Run Code Online (Sandbox Code Playgroud) 只是在工作中与同事交谈如何声明变量.对我来说,我已经决定了我喜欢哪种风格,但也许我错了.
"C"风格 - 功能开始时的所有变量.如果你想知道变量的数据类型,只需看一下函数的开头即可.
bool Foo()
{
PARAM* pParam = NULL;
bool rc;
while (true)
{
rc = GetParam(pParam);
... do something with pParam
}
}
Run Code Online (Sandbox Code Playgroud)
"C++"样式 - 将变量声明为尽可能本地.
bool Foo()
{
while (true)
{
PARAM* pParam = NULL;
bool rc = GetParam(pParam);
... do something with pParam
}
}
Run Code Online (Sandbox Code Playgroud)
你喜欢哪个?
更新 问题是关于POD变量.
我想使用列实用程序来格式化对齐列中的iostat输出.
我想运行类似的东西:
vmstat 1 10 | column -t
Run Code Online (Sandbox Code Playgroud)
但是输出仅在10秒后出现(vmstat完成其工作),而不是每秒.
有任何想法吗?
我有一个多线程的应用程序.每个模块都在一个单独的线程中执行.模块是:
- network module - used to receive/send data from network
- parser module - encode/decode network data to internal presentation
- 2 application module - perform some application logic on the above data one after other
- counter module - used to gather statistics from other modules
- timer module - used to schedule timers
- and much more ...
Run Code Online (Sandbox Code Playgroud)
所有线程都使用消息队列进行线程间通信(通过条件变量和互斥锁进行std :: deque同步).
一些模块被其他模块使用(例如,所有模块都使用定时器和计数器),并且对于从网络接收的每个消息,这应该以非常高的速率处理.
这是非常复杂的应用程序,设计看起来"合理".另一方面,我不确定这样的设计,每个模块的线程是"最好的"吗?特别是,我担心这样的设计"包装"了很多上下文切换.
你怎么看?
是否有任何好的指导方针或开源项目可以学习如何对线程应用程序进行"正确"设计?
我看到很多次代码将函数的返回状态设置为*rc* variable(例如int rc = foo();).我虽然是某种惯例,但我在代码中盲目地使用它.
最近有人问同事*rc*代表什么,发现我确实不知道答案.
谢谢
给定遗留代码,系统具有以下类的层次结构:
Base
^
|
----------+---------------
^ ^ ^ ^ ^
| | | | |
A1 B1 C1 D1 E1
^ ^ ^ ^ ^
| | | | |
A2 B2 C2 D2 E2
.......
^ ^ ^ ^ ^
| | | | |
An Bn Cn Dn En
Run Code Online (Sandbox Code Playgroud)
层次结构表示某个特定域中的消息.
基类当然是所有消息的基类.A1..E1是属于域的版本1,A2..E2到版本2的消息,依此类推.请注意,An必须直接从An-1继承,因为An会覆盖An-1的特定方法.
所有消息都有一些共同的功能,因此它被定义为Base :: PerformFunctionality.功能的某些部分仅特定于版本n,因此存在虚函数Base :: SpecificPartOfFunctionality,它由Base :: PerformFunctionality调用.
所以我的问题是如何通过所有An..En 覆盖Base :: SpecificPartOfFunctionality.
我看到了两种可能的解决方案,我不太喜欢它们:
在每个An..En中实现Base :: SpecificPartOfFunctionality …
我有第三方库一个,那需要一些库乙. A链接到binrary,它与静态版本B链接.因此,不再需要B的动态版本.
A不在我的控制之下,我无法重新编译它.因此,我想删除A的DYNAMIC部分的NEEDED libA条目.
有没有办法用objcopy或其他工具做到这一点?
尝试做:
help:
@echo "you must $(call red_text,clean)"
Run Code Online (Sandbox Code Playgroud)
其中 red_text 定义为
red_text = $(shell tput setaf 1; echo -n "$1"; tput sgr0)
Run Code Online (Sandbox Code Playgroud)
这将打印“you Must clean”,其中“clean”一词以红色打印。
问题是当 make 的输出通过管道传送时(例如传送到 less)。在这种情况下,我不应该使用颜色,而应该打印 1 美元。
我需要更新red_text来处理这个案子。为此,我认为我可以使用类似的东西$(shell [ -t 1 ] ..),但问题是标准输出从来$(shell)都不是终端。
当标准输出不是终端时,如何更改red以处理这种情况?
我在OpenSSL 1.0.1e上使用boost 1.54.0.
当我不时关闭SSL连接对象时,我看到没有调用async_shutdown()的完成处理程序.
经过调试后我发现,当出现async_write()时会发生这种情况.
SSL async_shutdown()应该发送SSL警报(关闭),因此我们在这里有2次写入.我知道禁止多个async_write().
我该如何应对这种情况?我应该在调用SSL async_shutdown()之前等待async_write()完成吗?
编辑:根据这一点,我可能需要在底层TCP套接字上取消()取消所有未完成的异步操作.这是对的吗?
编辑如果我一直在使用async_ API,我可以打电话shutdown()或者我必须打电话async_shutdown()吗?
c++ ×5
bash ×2
coding-style ×2
linux ×2
boost ×1
boost-asio ×1
compilation ×1
declaration ×1
elf ×1
formatting ×1
gcc ×1
linker ×1
linux-kernel ×1
makefile ×1
overriding ×1
scope ×1
shell ×1