相关疑难解决方法(0)

为什么在宏中使用明显无意义的do-while和if-else语句?

在许多C/C++宏中,我看到宏的代码包含在看似无意义的do while循环中.这是一些例子.

#define FOO(X) do { f(X); g(X); } while (0)
#define FOO(X) if (1) { f(X); g(X); } else
Run Code Online (Sandbox Code Playgroud)

我看不出它do while在做什么.为什么不在没有它的情况下写这个?

#define FOO(X) f(X); g(X)
Run Code Online (Sandbox Code Playgroud)

c c++ c++-faq c-preprocessor

758
推荐指数
8
解决办法
9万
查看次数

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

具有尾随注释的多行预处理器宏

我想定义以下普通的宏:

#define MY_ENUM enum MyEnum{ \
    myVal0, \ //Describes this situation
    myVal2  \ //Describes that situation
}
Run Code Online (Sandbox Code Playgroud)

令我惊讶的是,这不起作用error: stray ‘\’ in program.反斜杠导致后甚至是一些空格warning: backslash and newline separated by space.正如这个答案所指出的那样,反斜杠必须是该行的最后一个字符.这个答案指出在处理注释之前会发生行拼接.之所以选择这个订单,对我来说绝对没有意义; 我可以想象这样做的唯一原因是允许多行评论,如下所示:

//This is a comment which \
follows in the next line
Run Code Online (Sandbox Code Playgroud)

这看起来非常危险,因为这样的事情可能只会吞噬下一行中的任何代码.相反的顺序,即在拼接线之前用单个空格替换每个注释听起来像是一个更明智的选择.有人可以解释为什么做出这个选择吗?

我可以通过以下方法解决原始问题:

#define MY_ENUM enum MyEnum{ \
    myVal1, /*Describes this situation*/ \
    myVal2  /*Describes that situation*/ \
}
Run Code Online (Sandbox Code Playgroud)

我做这个笨拙的枚举宏定义的目的是这个宏必须在c ++(由于Qt绝对必须是一个类成员)和c之间共享.定义一个这样的宏看起来像是我的唯一解决方案,但上面的解决方案看起来很难看,我绝对不想让枚举取消注释.我接近这个问题了吗?

c c++ gcc g++ c-preprocessor

6
推荐指数
1
解决办法
476
查看次数

__SOCKADDR_COMMON (sin_) 是什么意思?

我正在跟踪一段代码,其中使用预定义的 struct sockaddr_in 的作者编写的代码host_addr.sin_family = AF_INET;试图在 Linux(Ubuntu)中设置一个迷你网络服务器。但是sin_family并没有出现在struct sockaddr_in定义中的任何地方。__SOCKADDR_COMMON (sin_)定义中包含的 是否有特殊含义?

在网络服务器的源文件中,他包含<sys/socket.h>, <netinet/in.h>, <arpa/inet.h>一个使用 Linux 库的预定义库。

我发现

#define __SOCKADDR_COMMON(sa 前缀) \
sa_family_t sa_prefix##family

在他使用的linux的库文件之一中。

我不明白这个定义。一点一点的解释会很好。

如果他通过参数定义了套接字的协议,为什么他必须设置套接字地址系列?

c linux network-programming websocket

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

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

反斜杠 - 换行符在#if和#elif上有效吗?

这与多行预处理器宏有关.我对#ifor 感兴趣#elif,而不是定义宏.例如,以下是否有效:

#if defined(X) || defined(Y) || \
    defined(Z)
...
#endif
Run Code Online (Sandbox Code Playgroud)

我问的原因是Clang,GCC和MSVC接受它,但Solaris上的一些Sun工具正在抱怨它.GCC记录1.2初始处理时的行为("反斜杠换行""续行"),但像DBX这样的Sun工具遇到内部错误.

c solaris c-preprocessor

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

是否可以使用 C++ 宏来生成代码块?

我有一个 C++ 程序,其中某些模式的代码块不断重复,我想知道是否可以使用 C++ MACROS 作为预处理器来自动生成此代码。更准确地说,我有一些看起来像这样的代码块:

for(std::size_t i=0;i< lc_.size(); i++)
{
  std::string str;
  state::MsData lc = data->lc(i);
  convert<data::ClassForLC>(lc.data(), str);
  lc_[i] = data::ClassForLC(str);
}
Run Code Online (Sandbox Code Playgroud)

然后我可能有另一个看起来像这样的块:

for(std::size_t i=0;i< mmop_.size(); i++)
{
  std::string str;
  state::MvData mmop = data->mmop(i);
  convert<data::ClassForMMOP>(mmop.data(), str);
  mmop_[i] = data::ClassForMMOP(str);
}
Run Code Online (Sandbox Code Playgroud)

正如你所看到的一般模式是这样的:

  for(std::size_t i=0;i< X_.size(); i++)
    {
      std::string str;
      Y X = data->X(i);
      convert<Z>(X.data(), str);
      X_[i] = Z(str);
    }
Run Code Online (Sandbox Code Playgroud)

我想知道是否可以定义一个宏 REPLACE(X,Y,Z) 用我作为参数传递的任何文本替换上面代码中的 X,Y,Z ?注意:我使用 C++11。谢谢

c++ c++11

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

多行表达式:C 编译器如何处理换行符?

我正在阅读有关 C 的 K&R 书的介绍部分。为了查看哪种代码格式会产生错误,我尝试分成printf("hello world!");不同的行,如下所示。问题是,我不知道我的结果是否与实现无关。我用的是GCC编译器。

C 标准对多行表达式有何规定?编译器如何处理它们?

/*
    printf("hello wor
    ld!\n");
*/

/*
    printf("hello world!
    \n");
*/

    printf("hello world!\
    n");

/*
    printf("hello world!\n
    ");
*/

    printf("hello world!\n"
    );

    printf("hello world!\n")
    ;

Run Code Online (Sandbox Code Playgroud)

注释掉的表达式会产生错误,而其余的则不会。

第三个表情的行为出乎意料。通常"需要在同一行终止,但第三个表达式可以工作。

第三个表达:

    printf("hello world!\
    n");
Run Code Online (Sandbox Code Playgroud)

输出到控制台:

hello world!    n
Run Code Online (Sandbox Code Playgroud)

似乎\可以用于将字符串拆分为多行,但前面的空格n");被包含为字符串的一部分。这是标准规则吗?

c format standards split multiline

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

关于C++预处理器的几个问题:

关于C++预处理器的一些问题:

  1. 如何让预处理器进入预处理代码的新行?
  2. 如何让预处理器在预处理代码中插入制表符或多个空格?
  3. 如何让预处理器在预处理代码中插入注释?

c++ c-preprocessor

-3
推荐指数
2
解决办法
1390
查看次数