小编Gab*_*les的帖子

C++ 代码生成的宏替代方案

我的设置模块有一些冗余代码:

#include <QSettings>

class MySettings
{
public:
    // param1
    void setParam1(QString param1) { _settings.setValue("param1", param1); }
    string param1() { return _settings.value("param1").toString(); }

    // param2
    void setParam2(int param2) { _settings.setValue("param2", param2); }
    int param2() { _settings.value("param2").toInt(); }

    // param3
    void setParam3(int param3) { _settings.setValue("param3", param3); }
    int param3() { _settings.value("param3").toInt(); }

private:
    QSettings _settings;
}
Run Code Online (Sandbox Code Playgroud)

我设法通过使用宏减少了要编写的代码量。以下是QString参数类型的示例:

#define INTSETTING(setter, getter) \
    void set##setter(QString getter) { settings.setValue(#getter, getter);} \
    QString getter() {return settings.value(#getter).toString();}
Run Code Online (Sandbox Code Playgroud)

因为我使用的是 C++,所以我知道宏的使用是不好的。我正在寻找更清洁的替代品。

我给出了一个 Qt 示例(QString),但这是一个更一般的问题。

编辑:

宏使上述类的定义更加简单:

class …
Run Code Online (Sandbox Code Playgroud)

c++ macros coding-style

5
推荐指数
1
解决办法
4024
查看次数

调用"启动myapp"和"myapp"之间的区别

在Windows批处理文件或命令提示符中,start mspaint例如,调用和mspaint?之间的区别是什么?他们似乎做了完全相同的事情.

另一个例子,所有4个案例似乎做同样的事情.你能帮我理解微妙的差异是什么吗?

  1. taskmgr
  2. C:\Windows\System32\Taskmgr.exe
  3. start taskmgr
  4. start C:\Windows\System32\Taskmgr.exe

后续:它看起来像start打开一个单独的后台命令提示符来运行你之后编写的程序(来源:https://technet.microsoft.com/en-us/library/cc770297(v = ws.11).aspx).这与Linux的myApp &格式相同- 你有&后缀吗?

windows command-line command cmd batch-file

5
推荐指数
0
解决办法
72
查看次数

将运算符“”用于 std::chrono 和 gcc

我想使用std::chrono::duration文字,例如10s表示“10 秒”,如下所示:

std::chrono::duration<uint64_t, std::milli> millisecs = 10s;
Run Code Online (Sandbox Code Playgroud)

但是,我收到此错误:

main.cpp:20:17: error: unable to find numeric literal operator 'operator""s'
     millisecs = 20s; 
main.cpp:22:17: note: use -std=gnu++11 or -fext-numeric-literals to enable more built-in suffixes
Run Code Online (Sandbox Code Playgroud)

我已经添加-fext-numeric-literals到我的 gcc 编译命令中:

std::chrono::duration<uint64_t, std::milli> millisecs = 10s;
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

gcc user-defined-literals c++-chrono

5
推荐指数
1
解决办法
8362
查看次数

为什么STM32 gcc链接程序脚本会自动丢弃以下标准库中的所有输入节:libc.a,libm.a,libgcc.a?

从任何自动生成的STM32CubeMx生成的链接器脚本的底部:

/* Remove information from the standard libraries */
/DISCARD/ :
{
  libc.a ( * )
  libm.a ( * )
  libgcc.a ( * )
}
Run Code Online (Sandbox Code Playgroud)

从GNU Binutils ld(链接程序脚本)手册中,3.6.7输出节丢弃

特殊输出节名称“ / DISCARD /”可用于丢弃输入节。分配给名为“ / DISCARD /”的输出节的任何输入节均不包含在输出文件中。

这3个输入目标文件包含什么,为什么我们丢弃它们中的所有内容(所有输入部分)?

其他感兴趣的STM32链接器脚本主题:

  1. 在C中访问链接描述文件变量的“值”是否存在未定义的行为?
  2. 如何从C获取ld链接程序脚本中定义的变量的值

c linker stm32 ld binutils

5
推荐指数
1
解决办法
266
查看次数

在 C++ 中迭代枚举类的常用方法有哪些?

不幸的是,我发现迭代常规 s 的所有标准技术enum都不适用于enum classes,因为枚举类不会隐式转换为整数。

不是如何迭代枚举?,因为我询问的是 an enum class(即:强类型枚举),而他们询问的是常规enum(即:弱类型枚举)。

c++ enums enumeration enum-class

5
推荐指数
2
解决办法
7674
查看次数

将 `echo` 的管道输出发送到 netcat 失败,而 `printf` 的管道输出通过

我正在 Linux Ubuntu 18.04 和 20.04 上使用( ) 通过 TCP 以太网向Teledyne LeCroy T3PS3000电源设备发送命令。如果我使用该设备无法正确接收命令,但如果我使用它则工作正常。为什么?netcatncechoprintf

# Example command to Ethernet-connected digital power supply over TCP

# fails
echo 'measure:voltage? ch1' | timeout 0.2 nc 192.168.0.1 5025

# works
printf 'measure:voltage? ch1' | timeout 0.2 nc 192.168.0.1 5025
Run Code Online (Sandbox Code Playgroud)

参考:

  1. timeoutcmd: https: //unix.stackexchange.com/questions/492766/usage-of-nc-with-timeouts-in-ms/492796#492796
    1. 更新/注意(在我写完答案之后写的,所以printf下面的表格是正确的):如果没有该timeout命令,我们将不得不使用-w带有 的选项netcat,但它只接受以秒为单位的整个整数等待周期超时,如下所示(-w 1注意将“等待”时间或超时设置为 1 整秒):
      printf '%s' "my command to send" | nc -w1 …
      Run Code Online (Sandbox Code Playgroud)

bash shell netcat

5
推荐指数
1
解决办法
1913
查看次数

C++函数通过一个带有public成员指针的对象调用函数,而不使用dereference运算符

好吧,我认为标题足够描述(但令人困惑,抱歉).

我正在读这个库:Timer1.

在头文件中有一个指向函数的公共成员指针,如下所示:

class TimerOne
{
  public:
  void (*isrCallback)();
};
Run Code Online (Sandbox Code Playgroud)

存在TimerOne类的实例化对象,称为"Timer1".

Timer1调用该函数如下:

Timer1.isrCallback();
Run Code Online (Sandbox Code Playgroud)

这怎么回事?我熟悉通过使用dereference运算符通过函数指针调用函数.

例如:

(*myFunc)();
Run Code Online (Sandbox Code Playgroud)

所以我希望通过对象的上述调用更像是:

(*Timer1.isrCallback)();
Run Code Online (Sandbox Code Playgroud)

那么,通过函数指针调用函数的可接受选项是什么,作为独立的函数指针对象的成员?

c++ pointers function-pointers function

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

“弧形嫁接”和“弧形补丁”之间有什么区别?

arc help --full | less显示以下内容graft

  graft revision

      Grafts revision and its dependencies (if any) onto your working tree.

      --force
          Do not run any sanity checks.

      --skip-landed
          Do not try to patch landed/closed diffs.
Run Code Online (Sandbox Code Playgroud)

这是为了patch

  patch D12345
  patch --revision revision_id
  patch --diff diff_id
  patch --patch file
  patch --arcbundle bundlefile
      Supports: git, svn, hg
      Apply the changes in a Differential revision, patchfile, or arc
      bundle to the working copy.

      --arcbundle bundlefile
          Apply changes from an arc bundle …
Run Code Online (Sandbox Code Playgroud)

git phabricator arcanist

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

为什么不将 C++ 结构初始化为 `= {0}` 会将其所有成员设置为 0?

在做了大量测试并写下这个答案之后(注意:在我完全重写它之前对它的反对票),我不明白为什么= {0}不将结构的所有成员设置为零!

如果你这样做:

struct data_t
{
    int num1 = 100;
    int num2 = -100;
    int num3;
    int num4 = 150;
};

data_t d3 = {0};
printf("d3.num1 = %i\nd3.num2 = %i\nd3.num3 = %i\nd3.num4 = %i\n\n",
       d3.num1, d3.num2, d3.num3, d3.num4);
Run Code Online (Sandbox Code Playgroud)

...输出是:

d3.num1 = 0
d3.num2 = -100
d3.num3 = 0
d3.num4 = 150
Run Code Online (Sandbox Code Playgroud)

...虽然我预计输出是这样的:

d3.num1 = 0
d3.num2 = 0
d3.num3 = 0
d3.num4 = 0
Run Code Online (Sandbox Code Playgroud)

...这意味着只有 FIRST 成员被设置为零,其余的都被设置为默认值。

我一直认为以这 3 种方式中的任何一种初始化结构都会将其初始化为零,但显然我错了!

  1. data_t d{}
  2. data_t d …

c++ struct initialization zero-initialization

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

如何修复 C 中的错误或警告:“函数‘inet_aton’的隐式声明;您的意思是‘inet_pton’吗?”

我无法将inet_aton()ASCII IP 地址转换"192.168.0.1"struct in_addr字节顺序的地址,因为我无法编译代码。

\n

我正在处理这个文件:socket__geeksforgeeks_udp_server_GS_edit_GREAT.c

\n

这是我的构建命令:

\n
gcc -Wall -Wextra -Werror -O3 -std=c17 \\\nsocket__geeksforgeeks_udp_server_GS_edit_GREAT.c -o bin/server \\\n-lm && bin/server\n
Run Code Online (Sandbox Code Playgroud)\n

这是我的命令和错误输出:

\n
eRCaGuy_hello_world/c$ gcc -Wall -Wextra -Werror -O3 -std=c17 socket__geeksforgeeks_udp_server_GS_edit_GREAT.c -o bin/server -lm && bin/server\nsocket__geeksforgeeks_udp_server_GS_edit_GREAT.c: In function \xe2\x80\x98main\xe2\x80\x99:\nsocket__geeksforgeeks_udp_server_GS_edit_GREAT.c:159:15: error: implicit declaration of function \xe2\x80\x98inet_aton\xe2\x80\x99; did you mean \xe2\x80\x98inet_pton\xe2\x80\x99? [-Werror=implicit-function-declaration]\n     retcode = inet_aton("127.0.0.1", &addr_server.sin_addr);\n               ^~~~~~~~~\n               inet_pton\ncc1: all warnings being treated as errors\n
Run Code Online (Sandbox Code Playgroud)\n

我要修复的部分是:

\n
implicit declaration of function \xe2\x80\x98inet_aton\xe2\x80\x99; did you …
Run Code Online (Sandbox Code Playgroud)

c gcc glibc gcc-warning

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