我知道#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) 我很想能够做到这一点:
class myInt : public int
{
};
Run Code Online (Sandbox Code Playgroud)
为什么我不能?
我为什么要这样?更强的打字.例如,我可以定义两个类intA和intB,这让我做intA + intA或intB + intB,但不是intA + intB.
"Ints不是课程." 所以呢?
"Ints没有任何会员数据." 是的,他们有,他们有32位,或其他什么.
"Ints没有任何会员功能." 好吧,他们有很多像+和的运营商-.
以下 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) 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) 这是计算整数平方根的简单方法:
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) 我有一个Visual Studio项目,包含大约60个C++源文件.我可以做一个构建,它完成没有错误.但如果我再次立即点击F7,它总是会重新编译大约50个源文件.它不会重新编译所有文件,这很奇怪.
我有'启用最小重建'(/ Gm)设置.有什么想法可能会这样做吗?这些文件以后都没有修改日期.
我在这里完全错了,但据我所知,C++并没有真正的"成员函数指针"类型.我知道你可以使用Boost和mem_fun等做一些技巧.但是为什么C++的设计者决定不使用包含指向函数的指针的64位指针和指向对象的指针?
我的意思是指向未知类型的特定对象的成员函数的指针.IE可以用来回调的东西.这将是一个包含两个值的类型.第一个值是指向函数的指针,第二个值是指向对象的特定实例的指针.
我不是指一个指向类的一般成员函数的指针.例如
int (Fred::*)(char,float)
Run Code Online (Sandbox Code Playgroud)
它本来是如此有用,让我的生活更轻松.
雨果
在C++中,我有一个map<string, string>,包含未知数量的条目.如何将其传递给Lua函数,以便Lua函数可以将数据用作表格?
为什么编译器只能在我输入时编译我的代码?
从用户的角度来看,它可以像今天的语法着色一样顺畅.如果您停止输入足够长的时间(可能是几秒钟),编译(不是链接)将完成,并且将使用语法着色等方法识别代码错误.
这不像我的3GHz四核怪物计算机真的忙于做其他事情.为什么不让它一直编译?
此问题与使用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++ ×4
c ×2
algorithm ×1
c++11 ×1
coding-style ×1
enums ×1
function ×1
gcc ×1
gcc-warning ×1
indentation ×1
inheritance ×1
integer ×1
lambda ×1
lifetime ×1
lua ×1
lua-table ×1
macros ×1
map ×1
math ×1
member ×1
optimization ×1
pointers ×1
rebuild ×1
string ×1