相关疑难解决方法(0)

如何使用C预处理器连接两次并扩展宏,如"arg ## _ ## MACRO"?

我正在尝试编写一个程序,其中一些函数的名称依赖于某个宏变量的值,宏如下:

#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 concatenation token c-preprocessor

141
推荐指数
3
解决办法
7万
查看次数

C中的静态断言

在C(而不是C++)中实现编译时静态断言的最佳方法是什么,特别强调GCC?

c gcc assert static-assert compile-time

79
推荐指数
4
解决办法
6万
查看次数

#define中的##是什么意思?

这条线是什么意思?特别是,是什么##意思?

#define ANALYZE(variable, flag)     ((Something.##variable) & (flag))

编辑:

有点困惑.没有结果会是##什么?

c c++ c-preprocessor

32
推荐指数
3
解决办法
2万
查看次数

最简单,最新的c ++ 11 ScopeGuard

我正在尝试编写一个基于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)

c++ lambda scopeguard exception-safety c++11

31
推荐指数
8
解决办法
3万
查看次数

用于在C中连接两个字符串的宏

我正在尝试定义一个宏,假设它采用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 string c-preprocessor

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

C宏:显然无用宏的优点/意图

我在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)

完全被这个宏的观点困惑,我广泛研究了宏的优点/缺点和属性,但我仍然无法弄清楚这个宏的用途是什么.我错过了什么吗?

c macros

21
推荐指数
2
解决办法
947
查看次数

预处理程序令牌扩展

我对预处理器如何工作的心理模型显然是不完整的,这让我发疯.

我想连接两个标记,但第二个标记应该首先扩展.

#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.目前,这对我来说似乎很神奇.

任何人都可以向我解释这种行为吗?扩展规则如何正常工作?

c c++ c-preprocessor

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

使用__LINE__为不同的变量名创建宏

可能重复:
使用##和LINE创建C宏(使用定位宏进行标记连接)

我试图使用__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.

c++ macros concatenation visual-studio-2010 c-preprocessor

13
推荐指数
3
解决办法
8964
查看次数

在##连接之前评估预处理程序令牌

我想在它与其他东西连接之前评估一个令牌."问题"是标准将行为指定为

在重新检查替换列表以更换更多宏名称之前,删除替换列表中的##预处理标记的每个实例(不是来自参数),并将前面的预处理标记与以下预处理标记连接起来.

因此在下面的例子中,

#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)

c string-concatenation stringification c-preprocessor

11
推荐指数
2
解决办法
3128
查看次数

QThreads,QObject和睡眠功能

我遇到的问题是,我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线程更快或更慢.

c++ qt qthread

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