小编Roc*_*net的帖子

缩进#defines

我知道#defines等通常不会缩进.为什么?

我正在使用一些代码,其中包含#defines,#ifdefs,#elses,#endifs等的可怕混合.所有这些通常与正常的C代码混合在一起.#defines 的非缩进使它们难以阅读.缩进代码与非缩进#defines的混合是一场噩梦.

不缩进#define的好处是什么?如果我缩进它会不会让我成为一个坏人?这不是更好吗?

#ifdef SDCC
    #if DEBUGGING == 1
        #if defined (pic18f2480)
            #define FLASH_MEMORY_END 0x3DC0
        #elif defined (pic18f2580)
            #define FLASH_MEMORY_END 0x7DC0
        #else
            #error "Can't set  up flash memory end!"
        #endif
    #else
        #if defined (pic18f2480)
            #define FLASH_MEMORY_END 0x4000
        #elif defined (pic18f2580)
            #define FLASH_MEMORY_END 0x8000
        #else
            #error "Can't set  up flash memory end!"
        #endif
    #endif
#else
    #if DEBUGGING == 1
        #define FLASH_MEMORY_END 0x7DC0
    #else
        #define …
Run Code Online (Sandbox Code Playgroud)

c coding-style code-formatting indentation c-preprocessor

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

为什么我不能在C++中继承int?

我很想能够做到这一点:

class myInt : public int
{

};
Run Code Online (Sandbox Code Playgroud)

为什么我不能?

我为什么要这样?更强的打字.例如,我可以定义两个类intAintB,这让我做intA + intAintB + intB,但不是intA + intB.

"Ints不是课程." 所以呢?

"Ints没有任何会员数据." 是的,他们有,他们有32位,或其他什么.

"Ints没有任何会员功能." 好吧,他们有很多像+和的运营商-.

c++ inheritance integer language-design strong-typing

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

通过引用传递的 Lambda 在构造函数中调用时运行,但稍后存储在数据成员中时不会运行

以下 C++ 代码打印11.1然后崩溃。lambda 函数似乎在构造函数内被正确调用,但后来,相同的函数不再起作用!为什么会发生这种情况?lambda 的寿命有限制吗?

#include <functional>
#include <iostream>

class LambdaStore
{
public:
    LambdaStore(const std::function<void(float)>& _fn)
    : fn(_fn)
    {
        fn(11.1f);    // works
    }

    void ExecuteStoredLambda()
    {
        fn(99.9f);    // crashes
    }

private:
    const std::function<void(float)>& fn;
};

int main()
{
    LambdaStore lambdaStore([](float a) { std::cout << a << '\n'; });

    lambdaStore.ExecuteStoredLambda();
}
Run Code Online (Sandbox Code Playgroud)

c++ lambda lifetime c++11

43
推荐指数
4
解决办法
6361
查看次数

如何让gcc警告将错误的枚举传递给函数

gcc似乎没有使用以下代码生成警告.如何让它产生警告?

typedef enum
{
    REG8_A,
    REG8_B,
    REG8_C
}REG8;

typedef enum
{
    REG16_A,
    REG16_B,
    REG16_C
}REG16;

void function(REG8 reg8)
{

}

int main(void)
{
    function(REG16_A);    // Should warn about wrong enum
}
Run Code Online (Sandbox Code Playgroud)

enums gcc gcc-warning

23
推荐指数
3
解决办法
7656
查看次数

按位整数立方根算法

这是计算整数平方根的简单方法:

int isqrt(int num)
{
    int root=0;
    int b = 0x8000;
    int a=0, c=0;

    while (b) {
        c = a|b;

        if (c*c <= num)
            a |= b;   

        b >>= 1;
    }       
}
Run Code Online (Sandbox Code Playgroud)

巧妙地(感谢维基百科),这可以像这样进行优化:

int sqrt(short num)
{
    int op = num;
    int res = 0;
    int one = 1 << 30;

    while (one > op)
        one >>= 2;

    while (one != 0) {
        if (op >= res + one) {
            op -= res + one;
            res = (res …
Run Code Online (Sandbox Code Playgroud)

algorithm math optimization

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

为什么Visual Studio 2008总是重建我的整个项目?

我有一个Visual Studio项目,包含大约60个C++源文件.我可以做一个构建,它完成没有错误.但如果我再次立即点击F7,它总是会重新编译大约50个源文件.它不会重新编译所有文件,这很奇怪.

我有'启用最小重建'(/ Gm)设置.有什么想法可能会这样做吗?这些文件以后都没有修改日期.

rebuild visual-studio

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

为什么C++没有指向成员函数类型的指针?

我在这里完全错了,但据我所知,C++并没有真正的"成员函数指针"类型.我知道你可以使用Boost和mem_fun等做一些技巧.但是为什么C++的设计者决定不使用包含指向函数的指针的64位指针和指向对象的指针?

我的意思是指向未知类型特定对象的成员函数的指针.IE可以用来回调的东西.这将是一个包含两个值的类型.第一个值是指向函数的指针,第二个值是指向对象的特定实例的指针.

我不是指一个指向类的一般成员函数的指针.例如

int (Fred::*)(char,float)
Run Code Online (Sandbox Code Playgroud)

它本来是如此有用,让我的生活更轻松.

雨果

c++ pointers function member

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

如何在C++中创建Lua表,并将其传递给Lua函数?

在C++中,我有一个map<string, string>,包含未知数量的条目.如何将其传递给Lua函数,以便Lua函数可以将数据用作表格?

c++ string lua map lua-table

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

为什么编译器只能在我输入时编译我的代码?

为什么编译器只能在我输入时编译我的代码?

从用户的角度来看,它可以像今天的语法着色一样顺畅.如果您停止输入足够长的时间(可能是几秒钟),编译(不是链接)将完成,并且将使用语法着色等方法识别代码错误.

这不像我的3GHz四核怪物计算机真的忙于做其他事情.为什么不让它一直编译?

compiler-theory syntax-highlighting

9
推荐指数
2
解决办法
515
查看次数

在C中创建字符串,其中第一个字符为字符串长度

此问题与使用charliteral的Concatenate字符串文字有关,但稍微复杂一些。

我想创建一个字符串文字,其中字符串的第一个字符是字符串的长度,第二个字符是常量。这是当前的操作方式:

const char myString[] = 
{
    0x08,
    SOME_8_BIT_CONSTANT,
    'H',
    'e',
    'l',
    'l',
    'o',
    0x00
};
Run Code Online (Sandbox Code Playgroud)

理想情况下,我想将其替换为:

const char myString[] = BUILD_STRING(0xAA, "Hello");
Run Code Online (Sandbox Code Playgroud)

我试过这样实现:

#define STR2(S) #S
#define STR(S) STR2(S)
#define BUILD_STRING(C, S)  {(sizeof(S)+2), C, S}

const char myString[] = BUILD_STRING(0xAA, "Hello");
Run Code Online (Sandbox Code Playgroud)

但它扩展为:

const char myString[] = {(sizeof("Hello")+2), 0xAA, "Hello"};
Run Code Online (Sandbox Code Playgroud)

而且编译器似乎不喜欢混合数字和字符串。

有什么办法吗?

c macros c-preprocessor

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