小编rve*_*rve的帖子

何时使用const char*以及何时使用const char []

我知道他们是不同的,我知道他们是如何不同的,我读了所有关于char*vs的问题char[]

但所有这些答案都没有告诉他们何时应该使用它们.

所以我的问题是:

你什么时候用的

const char *text = "text";
Run Code Online (Sandbox Code Playgroud)

你什么时候用的

const char text[] = "text";
Run Code Online (Sandbox Code Playgroud)

有没有指导方针或规则?

举个例子,哪一个更好:

void withPointer()
{
    const char *sz = "hello";
    std::cout << sz << std::endl;
}

void withArray()
{
    const char sz[] = "hello";
    std::cout << sz << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

(我知道std::string也是一个选项,但我特别想了解char指针/数组)

c c++

43
推荐指数
3
解决办法
5万
查看次数

私有静态成员函数有什么用?

我一直在寻找的请求剖析从升压:: ASIO例子,我想知道为什么私有成员函数一样is_char()static?:

class request_parser
{
  ...
  private:
    static bool is_char(int c);
  ...
};
Run Code Online (Sandbox Code Playgroud)

它用在函数消耗中,它不是静态函数:

boost::tribool request_parser::consume(request& req, char input)
{
  switch (state_)
  {
    case method_start:
    if (!is_char(input) || is_ctl(input) || is_tspecial(input))
    {
      return false;
    }
    ...
Run Code Online (Sandbox Code Playgroud)

只有成员函数可以调用,is_char()并且没有静态成员函数正在调用is_char().那么为什么这些函数是静态的呢?

c++ static-methods private-members

42
推荐指数
3
解决办法
3万
查看次数

如何记录函数可能抛出的所有异常?

如果你有一个公共函数可能抛出一个异常,它使用其他(私有或公共)辅助函数也可以抛出异常,我认为你应该记录公共函数可以抛出的异常,这包括辅助函数抛出的异常.

像这样(使用Doxygen):

/** 
 * @throw Exception ...
 * @throw ExceptionThrownByHelper ...
 * @throw ExceptionThrownByHelpersHelper ...
 */
void theFunction() 
{ 
    helperWhichMayThrowException();
}
Run Code Online (Sandbox Code Playgroud)

并且helperWhichMayThrowException()还调用可能抛出异常的其他函数.

为此,您可以:

  1. 递归地跟随所有函数theFunction()调用并查找该函数所引发的异常.这是很多工作,当您向助手添加异常时,您可能忘记在某处记录异常.
  2. 捕获助手抛出的所有异常theFunction()并转换它们,这样您就可以确定只抛出您指定的异常.但那么为什么要使用例外?
  3. 不要担心辅助函数抛出的异常,但是你不能对所有异常进行单元测试,因为你不知道公共函数可以抛出哪些异常
  4. 有一些工具(半)自动列出助手抛出的所有异常等.我查看了Doxygen的文档,但没有找到办法做到这一点.

我想使用选项4,但我还没有找到一个好的解决方案,也许它可以用Doxygen吗?或许我只是想要记录多少???

编辑:也许它不是很清楚,但我正在寻找一种简单的方法来记录所有异常(最好使用Doxygen)函数可能抛出而无需手动检查所有辅助函数.一种简单的方法包括"不记录所有异常"或"捕获并转换所有异常theFunction()"

c++ documentation doxygen exception

26
推荐指数
2
解决办法
2万
查看次数

可以从另一个线程调用sendBroadcast()吗?

我有一个创建线程的服务.该线程做一些工作,然后调用sendBroadcast()Service.这意味着sendBroadcast()从工作线程调用,而不是从服务运行的线程调用.

这是好还是我应该确保sendBroadcast()从与Service(通过使用HandlerRunnable)相同的线程调用?

我在stackoverflow和Dianne Hackborns帖子上发现了这个.

根据帖子,它应该没问题.我问的原因是因为帖子是2岁,也许有些事情发生了变化.此外,我在Android文档中找不到任何相关内容.

android

17
推荐指数
1
解决办法
5255
查看次数

在哪里定义异常类,内部类或更高级别?

异常类应该是可能抛出它们的类的一部分还是应该存在于更高级别?

例如 :

class Test
{
    public:
        class FooException: public ExceptionBase { };
        void functionThrowingFooException();
};
Run Code Online (Sandbox Code Playgroud)

要么

class FooException: public ExceptionBase { };
class Test
{
    public:
        void functionThrowingFooException();
};
Run Code Online (Sandbox Code Playgroud)

(functionThrowingFooException()是唯一能抛出的功能FooException)

c++ exception

13
推荐指数
1
解决办法
4048
查看次数

使用NULL引用好吗?

我遇到了这段代码:

void f(const std::string &s);
Run Code Online (Sandbox Code Playgroud)

然后打个电话:

f( *((std::string*)NULL) );
Run Code Online (Sandbox Code Playgroud)

我想知道其他人对这种结构的看法,它用于表示函数f()应该使用一些默认值(它计算)而不是一些用户提供的值.

我不知道该怎么想,它看起来很奇怪,但你觉得这个结构怎么样?

c++

12
推荐指数
3
解决办法
2723
查看次数

XMLString :: transcode的目的

我似乎不明白的目的XMLString::transcode(XMLCh*)XMLString::transcode(char*),因为很明显,我不明白之间的差别XMLCh*char*.有人可以让我更清楚吗?

c++ string char xerces-c xml-parsing

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

清除使用8位数据类型从0到255计数的代码

我想知道是否有一种使用8位数据类型从0到255计数的简洁方法,如:

for(uint8_t i(0);i<=255;++i)
{
    ....
}
Run Code Online (Sandbox Code Playgroud)

这显然不起作用,但它清楚地表明你想从0到255计数.

一个有效的解决方案是:

uint8_t i(0);
do
{
    ...
    ++i;
}
while(i > 0);
Run Code Online (Sandbox Code Playgroud)

但是在这里它根本不清楚从0到255的数量.

这也可以,但它只是丑陋恕我直言:

uint8_t i(0);
while(true)
{
    ...
    if (i == 255)
    {
        break;
    }
    ++i;
}
Run Code Online (Sandbox Code Playgroud)

所以我想知道,有没有一种干净的方法来做到这一点,而不使用更大的数据类型?

编辑:

  • 我喜欢使用for的版本,因为它使得它的意图清晰而不考虑:从0循环到255.所有其他版本需要考虑一下发生了什么,因此更容易混淆其他版本.
  • 我不想使用int,因为代码是用于内存不多的8位微控制器.

c embedded microcontroller

8
推荐指数
3
解决办法
3042
查看次数

使用boost :: asio在哪里实现协议?

我正在尝试实现一个简单的串行端口协议.它是这样的:

  1. 丢弃所有数据直到0xff收到
  2. 读标头(节点地址和数据长度,4个字节)
  3. 读取数据(最多64个字节)
  4. 读crc
  5. 处理收到的数据包
  6. 发送回复
  7. 0xff看到时,即使不像在数据中间那样预期,也意味着接收到新的数据包

我可以实现这个使用boost::asio::serial_portboost::asio::read()读取一个字节,并在接收时处理此字节.虽然这有效,但我想知道是否有更多"提升"的方式来做到这一点?

我一直在boost::asio::read_until()寻找阅读0xff,但后来我不知道如何丢弃这些数据.将数据存储在缓冲区中然后不使用缓冲区似乎有点浪费.

我可以使用boost::asio::read_until()读取直到数据包结束,但随后MatchCondition需要访问(缓冲区中的数据包的标头).似乎MatchCondition唯一得到最近收到的第一个和最后一个字节的迭代器.

此外,使用的数据boost::asio::read()最终在a中stream_buf,我必须将接收的数据解析为Packet对象.我可以Packet在一个单独的ParsePacket对象中进行解析,或者以某种方式将它与它集成boost::asio(类似于boost::asio::read(serial, myPacket);where myPacketPacket对象)

0xff在接收的数据中的任何地方看到时,这意味着新的数据包正在启动.因此,当0xff收到它时,它必须忘记任何先前接收的数据并开始接收新的数据包.

我打算使用异步操作并添加超时.

所以,我的问题是:在哪里实现这样的协议?或者更一般地,在哪里使用实现协议boost::asio.我不是在寻找有效的代码,而是建议在何处实现协议以及boost::asio使用哪些功能.

更新:

在这种情况下,没有使用流量控制(硬件或软件).

c++ protocols boost-asio

8
推荐指数
1
解决办法
2110
查看次数

何时使用复合类型和数组以及何时规范化数据库?

是否有关于何时规范化数据库或仅使用复合类型和数组的指南?

使用数组和复合类型时,我只能使用一个表.我也可以规范化数据库并使用几个表和连接.

你如何决定哪个选项最好?

postgresql database-normalization

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