我正在尝试编写一个程序,其中一些函数的名称依赖于某个宏变量的值,宏如下:
#define VARIABLE 3
#define NAME(fun) fun ## _ ## VARIABLE
int NAME(some_function)(int a);
Run Code Online (Sandbox Code Playgroud)
不幸的是,宏NAME()将其转化为
int some_function_VARIABLE(int a);
Run Code Online (Sandbox Code Playgroud)
而不是
int some_function_3(int a);
Run Code Online (Sandbox Code Playgroud)
所以这显然是错误的方式.幸运的是,VARIABLE的不同可能值的数量很小所以我可以简单地做一个#if VARIABLE == n并单独列出所有情况,但我想知道是否有一个聪明的方法来做到这一点.
在C(而不是C++)中实现编译时静态断言的最佳方法是什么,特别强调GCC?
这条线是什么意思?特别是,是什么##意思?
#define ANALYZE(variable, flag) ((Something.##variable) & (flag))
编辑:
有点困惑.没有结果会是##什么?
我正在尝试编写一个基于Alexandrescu概念但使用c ++ 11习语的简单ScopeGuard.
namespace RAII
{
template< typename Lambda >
class ScopeGuard
{
mutable bool committed;
Lambda rollbackLambda;
public:
ScopeGuard( const Lambda& _l) : committed(false) , rollbackLambda(_l) {}
template< typename AdquireLambda >
ScopeGuard( const AdquireLambda& _al , const Lambda& _l) : committed(false) , rollbackLambda(_l)
{
_al();
}
~ScopeGuard()
{
if (!committed)
rollbackLambda();
}
inline void commit() const { committed = true; }
};
template< typename aLambda , typename rLambda>
const ScopeGuard< rLambda >& makeScopeGuard( const aLambda& …Run Code Online (Sandbox Code Playgroud) 我正在尝试定义一个宏,假设它采用2个字符串值并返回它们之间的一个空格连接.似乎我可以使用除空间之外我想要的任何角色,例如:
#define conc(str1,str2) #str1 ## #str2
#define space_conc(str1,str2) conc(str1,-) ## #str2
space_conc(idan,oop);
Run Code Online (Sandbox Code Playgroud)
space_conc 将返回"idan-oop"
我想要一些东西回归"idan oop",建议?
我在C编程方面有一些经验,但我不敢称自己精通.最近,我遇到了以下宏:
#define CONST(x) (x)
Run Code Online (Sandbox Code Playgroud)
我发现它通常用于表达式,例如:
double x, y;
x = CONST(2.0)*y;
Run Code Online (Sandbox Code Playgroud)
完全被这个宏的观点困惑,我广泛研究了宏的优点/缺点和属性,但我仍然无法弄清楚这个宏的用途是什么.我错过了什么吗?
我对预处理器如何工作的心理模型显然是不完整的,这让我发疯.
我想连接两个标记,但第二个标记应该首先扩展.
#define ANSWER 42
#define FOO foo_ ## ANSWER
Run Code Online (Sandbox Code Playgroud)
在这里,FOO扩展到foo_ANSWER,但我希望它foo_42.所以我定义了一个MERGE宏,希望在连接之前以某种方式扩展参数:
#define MERGE(x, y) x ## y
#define BAR MERGE(bar_, ANSWER)
Run Code Online (Sandbox Code Playgroud)
但BAR仍然扩大到bar_ANSWER而不是bar_42.所以我定义了另一个宏HELPER:
#define HELPER(x, y) MERGE(x, y)
#define BAZ HELPER(baz_, ANSWER)
Run Code Online (Sandbox Code Playgroud)
现在BAZ已成功扩展到baz_42.目前,这对我来说似乎很神奇.
任何人都可以向我解释这种行为吗?扩展规则如何正常工作?
我试图使用__LINE__宏来生成不同的变量名称.我有一个名为Benchmark的作用域基准测试类(位于utils命名空间中),它的构造函数接受一个字符串.这是我创建的宏定义:
#define BENCHMARK_SCOPE utils::Benchmark bm##__LINE__(std::string(__FUNCTION__))
Run Code Online (Sandbox Code Playgroud)
不幸的是,这会导致以下错误:
<some_file_name>(59): error C2374: 'bm__LINE__' : redefinition; multiple initialization
这使我得出结论__LINE__宏不会扩展.我根据这篇文章创建了我的超时空.你有想法为什么__LINE__不扩大?
编辑:可能编译器信息也相关.我正在使用visual studio 2010.
我想在它与其他东西连接之前评估一个令牌."问题"是标准将行为指定为
在重新检查替换列表以更换更多宏名称之前,删除替换列表中的##预处理标记的每个实例(不是来自参数),并将前面的预处理标记与以下预处理标记连接起来.
因此在下面的例子中,
#include <stdlib.h>
struct xy {
int x;
int y;
};
struct something {
char * s;
void *ptr;
int size;
struct xy *xys;
};
#define ARRAY_SIZE(a) ( sizeof(a) / sizeof((a)[0]) )
#define DECLARE_XY_BEGIN(prefix) \
struct xy prefix ## _xy_table[] = {
#define XY(x, y) {x, y},
#define DECLARE_XY_END(prefix) \
{0, 0} \
}; \
struct something prefix ## _something = { \
"", NULL, \
ARRAY_SIZE(prefix ## _xy_table), \
&(prefix ## _xy_table)[0], \
};
DECLARE_XY_BEGIN(linear1)
XY(0, 0) …Run Code Online (Sandbox Code Playgroud) 我遇到的问题是,我QThreads根据大量文章决定实施他们应该采用的方式:
http://blog.qt.digia.com/blog/2010/06/17/youre-doing-it-wrong/
http://mayaposch.wordpress.com/2011/11/01/how-to-really-truly-use-qthreads-the-full-explanation/
并且问题在于,因为算法是在单独的QObject(包装QThread)中运行的.我该怎么称呼Thread::Sleep或者说什么呢?任何想法?
该软件的一个小描述.基本上我的申请解决了TSP(旅行商问题).随着搜索的进行,它将历史中的所有状态保存为frames...(如可视框架).搜索算法将在一个线程上运行.主线程正在使用GUI进行处理.然后有Mediaplayer类似的线程告诉Main线程在屏幕上显示什么帧.那么睡眠在哪里?在gui中有一个滑块,用户可以使用它来快进或以正常速度前进.滑块通过信号槽告诉Mediaplayer线程更快或更慢.