相关疑难解决方法(0)

为什么这个连接宏需要一个间接级别?

我找到了一篇有趣的小博文,解释了如何使用行号在宏中生成(半)唯一名称:

// Do magic! Creates a unique name using the line number
#define LINE_NAME( prefix ) JOIN( prefix, __LINE__ )
#define JOIN( symbol1, symbol2 ) _DO_JOIN( symbol1, symbol2 )
#define _DO_JOIN( symbol1, symbol2 ) symbol1##symbol2
Run Code Online (Sandbox Code Playgroud)

这里有两件事让我很困惑:

  1. 为什么LINE_NAMEJOIN在文件中声明之后才会工作?我认为C预处理器执行了线性传递,因此需要根据依赖性来定义宏,就像C函数在使用之前需要定义一样.
  2. 为什么有必要同时使用JOIN_DO_JOIN宏来获得正确的结果?在宏中具有这种间接级别似乎很奇怪.

我有一种感觉,这两个问题的答案是相关的,并且与C预处理器评估宏的方式有关.(但是,由于我甚至认为这个例子无效,我对宏如何工作的直觉显然已经过时了.)

c macros concat

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

在宏中连接字符串 - C++

连接宏中定义的字符串的最简单方法是什么.即我正在寻找的伪代码将是:

#define ROOT_PATH "/home/david/"
#define INPUT_FILE_A ROOT_PATH+"data/inputA.bin"
#define INPUT_FILE_B ROOT_PATH+"data/inputB.bin"
...
#define INPUT_FILE_Z ROOT_PATH+"data/inputZ.bin"
Run Code Online (Sandbox Code Playgroud)

我知道的唯一方法是在代码中使用strcat,或者使用字符串类然后使用c_str方法,但是当我有大量输入文件时它会变得混乱.我想直接使用INPUT_FILE_A等,而不是有很多局部变量.有没有办法做到这一点?

谢谢.

c c++ string concatenation

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

如何在宏定义中连接 __func__ 和 __LINE__

我想定义一个宏来连接__func__(或__FUNCTION____LINE__

以下工作正常:

// macro_test.cc
#include <iostream>

#define STR2(X) #X
#define STR(X) STR2(X)
#define FILE_LOCATION __FILE__ ":" STR(__LINE__) " "

int main() {
  std::cout << FILE_LOCATION << "is <file_name>:<line_number>" << std::endl;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是输出

$ ./a.out 
macro_test.cc:8 is <file_name>:<line_number>
Run Code Online (Sandbox Code Playgroud)

但是下面给出了一个编译错误(我只是用 替换 __FILE____func__):

// macro_test.cc
#include <iostream>

#define STR2(X) #X
#define STR(X) STR2(X)
#define FUNC_LOCATION __func__ ":" STR(__LINE__) " "

int main() {
  std::cout << FUNC_LOCATION << "is <function_name>:<line_number>" << std::endl; …
Run Code Online (Sandbox Code Playgroud)

c c++ gcc c-preprocessor

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

将具有多个点(版本号)的格式的数字转换(转换)为字符串

#define EXTERNAL_API_VERSION 1.12.1
std::string version = boost::lexical_cast<std::string>(EXTERNAL_API_VERSION);
Run Code Online (Sandbox Code Playgroud)

此代码生成编译错误:

error C2143: syntax error : missing ')' before 'constant'
error C2059: syntax error : ')'
Run Code Online (Sandbox Code Playgroud)

是否有任何简单的替代方法可以将这种格式(多于一个点)的数字转换为字符串?

c++ string

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

标签 统计

c ×3

c++ ×3

string ×2

c-preprocessor ×1

concat ×1

concatenation ×1

gcc ×1

macros ×1