小编ppr*_*ger的帖子

没有RTTI的类标识

我在互联网上的某个地方找到了一个简单的解决方案,没有内置的C++ RTTI.

template <typename T>
class Identity {
public:
    static int64_t id()
    {
        static int64_t dummy;
        return reinterpret_cast<int64_t>(&dummy);
    }
};
Run Code Online (Sandbox Code Playgroud)

当我们需要一些类ID时,我们只需使用:

Identity<OurClass>::id();
Run Code Online (Sandbox Code Playgroud)

我想知道,有没有碰撞?它可以为不同的类返回相同的ID,还是为相同的类返回不同的ID?我用g ++尝试了这个带有不同优化值的代码,一切似乎都没问题.

c++ identity rtti

13
推荐指数
1
解决办法
1353
查看次数

fgetc,检查EOF

Linux系统编程一书中,我读过这样的文章:

fgetc返回读取作为字符unsigned char强制转换为intEOF在文件或错误的结束.使用的常见错误fgetc是:

char c;
if ((c = fgetc()) != EOF) {...}
Run Code Online (Sandbox Code Playgroud)

这段代码的正确版本是:

int c;
if ((c = fgetc()) != EOF) { printf("%c", (char)c); ... }
Run Code Online (Sandbox Code Playgroud)

那么,为什么我不能char在比较之前投出一个返回值EOF呢?为什么我要与之EOF完全比较int?如EOF定义的那样-1,它通常不会被投放到char
是否有平台/编译器不适用?

c eof fgetc

10
推荐指数
2
解决办法
8150
查看次数

从函数返回struct

可能重复:
返回包含数组的结构

我有一些简单的代码:

struct s {
    char str[128];
};

struct s foo()
{
    struct s s = { "some string" };
    return s;
}

int main()
{
    printf("%s\n", foo().str);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是它会发出警告:

警告:格式'%s'需要'char*'类型的参数,但参数2的类型为'char [128]'[-Wformat]

如果我改变那样的主要功能

int main()
{
    struct s s = foo();
    printf("%s\n", s.str);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

一切都好.那么,第一个代码中的问题是什么?谢谢.

PS.即时通讯使用gcc-4.7.0

PPS.请注意,问题只发生在C编译器上,C++一切正常

c struct function

6
推荐指数
0
解决办法
153
查看次数

标签 统计

c ×2

c++ ×1

eof ×1

fgetc ×1

function ×1

identity ×1

rtti ×1

struct ×1