我找到了一篇有趣的小博文,解释了如何使用行号在宏中生成(半)唯一名称:
// 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)
这里有两件事让我很困惑:
LINE_NAME宏JOIN在文件中声明之后才会工作?我认为C预处理器执行了线性传递,因此需要根据依赖性来定义宏,就像C函数在使用之前需要定义一样.JOIN和_DO_JOIN宏来获得正确的结果?在宏中具有这种间接级别似乎很奇怪.我有一种感觉,这两个问题的答案是相关的,并且与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等,而不是有很多局部变量.有没有办法做到这一点?
谢谢.
我想定义一个宏来连接__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) #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)
是否有任何简单的替代方法可以将这种格式(多于一个点)的数字转换为字符串?