相关疑难解决方法(0)

C/C++中的字符大小('a')

C和C++中的字符大小是多少?据我所知,char的大小在C和C++中都是1个字节.

在C:

#include <stdio.h>
int main()
{
    printf("Size of char : %d\n", sizeof(char));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在C++中:

#include <iostream>
int main()
{
    std::cout << "Size of char : " << sizeof(char) << "\n";
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

没有惊喜,它们都给出了输出: Size of char : 1

现在我们知道,字符表示为'a','b','c','|',...所以我只是修改了上面的代码对这些:

在C:

#include <stdio.h>
int main()
{
    char a = 'a';
    printf("Size of char : %d\n", sizeof(a));
    printf("Size of char : %d\n", sizeof('a'));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

Size of char …
Run Code Online (Sandbox Code Playgroud)

c c++ types

287
推荐指数
4
解决办法
27万
查看次数

为什么"sizeof(a?true:false)"给出四个字节的输出?

我有一小段关于sizeof三元运算符的运算符的代码:

#include <stdio.h>
#include <stdbool.h>

int main()
{
    bool a = true;
    printf("%zu\n", sizeof(bool));  // Ok
    printf("%zu\n", sizeof(a));     // Ok
    printf("%zu\n", sizeof(a ? true : false)); // Why 4?
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出(GCC):

1
1
4 // Why 4?
Run Code Online (Sandbox Code Playgroud)

但在这里,

printf("%zu\n", sizeof(a ? true : false)); // Why 4?
Run Code Online (Sandbox Code Playgroud)

三元运算符返回boolean类型,sizeof bool类型是1C中的字节.

为什么要sizeof(a ? true : false)输出四个字节?

c boolean sizeof conditional-operator c11

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

当在C89模式下编译时,以下程序如何输出`C89`和在C99模式下编译时输出`C99`?

我从网上找到了这个C程序:

#include <stdio.h>

int main(){

    printf("C%d\n",(int)(90-(-4.5//**/
    -4.5)));

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这个程序的有趣之处在于,当它在C89模式下编译和运行时,它会打印C89,当它被编译并在C99模式下运行时,它会打印出来C99.但我无法弄清楚这个程序是如何工作的.

你能解释一下第二个参数如何printf在上面的程序中起作用吗?

c printf comments c99 c89

125
推荐指数
3
解决办法
5605
查看次数

使用printf打印size_t的正确方法是什么?

Size_t被定义为一个unsigned整数,但它的大小取决于你是在32位还是64位机器上.什么是正确和便携的打印方式size_t

c c++

68
推荐指数
3
解决办法
5万
查看次数

为什么这个宏被替换为20而不是10?

1. #define NUM 10
2. #define FOO NUM
3. #undef NUM
4. #define NUM 20
5. 
6. FOO
Run Code Online (Sandbox Code Playgroud)

当我只运行预处理器时,输出文件包含20.

但是,根据我的理解,预处理器只是简单地替换文本.所以这就是我认为正在发生的事情(这显然是错误的但是很蠢):

  1. NUM定义为10.
  2. 因此,在第2行中,NUM被替换为10.所以现在我们有"#define FOO 10".
  3. NUM未定义.
  4. NUM已重新定义,现在为20.
  5. 根据第2行更换FOO,第2行在第4行重新定义之前,为10.

所以我认为输出应该是10而不是20.可以解释它出错的地方吗?

macros c-preprocessor

65
推荐指数
4
解决办法
2866
查看次数

C++运算符%保证

难道保证(-x) % m,在这里xm在C++中积极标准(C++ 0x中)为负,等于-(x % m)

我知道它在我知道的所有机器上都是正确的.

c++ modulo language-lawyer

20
推荐指数
2
解决办法
1252
查看次数


不同编译器的不同输出 - C和C++

你能想到"一个程序",它为C和C++编译器提供了"不同的输出"(但是在同一种语言下提供了一致的输出)吗?

c c++ compilation

12
推荐指数
4
解决办法
1376
查看次数

重新考虑在C++中包含C头

我刚刚阅读了一个关于SO讨论场景的问题,其中一段代码在C和C++中都有效,但会在每种语言中产生不同的行为.

这引出了一个问题:在C++代码中包含C头时,这可能是一个问题吗?

从这个问题中知道你应该包含这样的C头:

extern "C" {
#include <your_os_or_library_header_in_c.h>
}
Run Code Online (Sandbox Code Playgroud)

但到目前为止我发现的只是extern"C"只能保证关闭名称.

我找不到任何有关它是否将所有语句评估为C的信息,因此eg sizeof('a')10 //* comment */ 2(您可以在内联函数中找到)被解析为C而不是C++.(请注意,依赖于编写C头的人这样的行为显然是一个坏主意,但我从纯粹的学术角度问"如果会怎么样?".)

C++标准是否说包含一段代码extern "C"意味着其中的所有语句都必须解析为C?

c c++ header-files extern

6
推荐指数
1
解决办法
366
查看次数

std :: isinf不能与-ffast-math一起使用.如何检查无穷大

示例代码:

#include <iostream>
#include <cmath>
#include <stdint.h>

using namespace std;

static bool my_isnan(double val) {
    union { double f; uint64_t x; } u = { val };
    return (u.x << 1) > 0x7ff0000000000000u;
}

int main() {
    cout << std::isinf(std::log(0.0)) << endl;
    cout << std::isnan(std::sqrt(-1.0)) << endl;
    cout << my_isnan(std::sqrt(-1.0)) << endl;
    cout << __isnan(std::sqrt(-1.0)) << endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在线编译器.

使用-ffast-math,该代码打印"0,0,1,1" - 没有,它打印"1,1,1,1".

那是对的吗?在这些情况下,我认为std::isinf/ std::isnan应该仍然可以使用-ffast-math.

另外,我如何检查无限/ NaN -ffast-math?您可以看到my_isnan这样做,它确实有效,但该解决方案当然非常依赖于架构.另外,为什么在 …

c++ c++-standard-library fast-math

5
推荐指数
1
解决办法
2973
查看次数

带和不带 -std=c99 的代码会产生不同的结果(UMAC AE 实现)

长话短说——我使用 Ted Krovetz 的实现来计算UMACUMAC AE加密 ( http://www.fastcrypto.org/ )。

当我用 编译我的代码(和/或中的测试umac.c)时-std=c99,计算出的结果UMAC与预期完全不同(并且是错误的)。当我删除这个选项时,一切都像魅力一样。

有什么想法可能导致这种情况吗?我可以做什么来检查发生了什么以及什么产生了不同的结果?


$ gcc --version
gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2

$ uname -a
xxx 3.13.0-43-generic #72-Ubuntu SMP .. x86_64 x86_64 x86_64 GNU/Linux
Run Code Online (Sandbox Code Playgroud)

我不使用任何其他选项 - 只是使用和不使用-std=c99.


再说几句话:

我会尝试联系 Ted Krovetz 并向他询问这个问题(可能是一些错误或其他问题),但这不是重点。这个问题有点笼统,这个具体问题可以看作是一个例子。

我跑了valgrind——没什么特别的。添加-Wall并且-Wextra-什么也没有了。听起来像UB,但valgrind没有抱怨任何事情。

这种情况非常有趣,花了我很多天和头痛才明白,问题不在我的代码中(我使用这个实现来实现复杂的协议),而是在算法中,尤其是在这个选项中。所以我决定征求意见。

在 C 和 C++ 中都有效的代码在用每种语言编译时会产生不同的行为吗?根本不相关,因为我们在这里谈论的是同一种语言。
这种没有“-std=c99”的巨大 fprintf 速度差异很接近,但还不够。


编辑

这是我的测试结果和我所做的(源/标题刚刚下载,我没有更改任何内容): …

c gcc c99 compiler-options

4
推荐指数
1
解决办法
353
查看次数

不用g ++编译c代码的主要原因是什么?

首先,抱歉问这么奇怪的问题

我在一个项目中使用了c,经过一些研究,我找到了一些更好的方法和一些c ++库,但我真的不想重写代码(例如,printf到cout).

我做了一些搜索,我得到了:"他们是两种非常不同的语言","不要做"等等,但我从来没有找到详细的解释

为什么?有一些推荐的文章可读吗?

c c++ compilation

4
推荐指数
3
解决办法
961
查看次数

如何从C函数访问C++类数据成员

假设有一个 C++ 类定义如下,

/* goo.h */
#ifdef __cplusplus
class goo{
public:
    vector<int> a;
    vector<int> b;
    void calc();
};
#else
typedef struct goo goo;
#endif

#ifdef __cplusplus
extern "C" {

#if defined(__STDC__) || defined(__cplusplus)
void goo_calc(goo *);
#endif

#ifdef __cplusplus
}
#endif
Run Code Online (Sandbox Code Playgroud)

然后我想goo::calc()用C实现,所以我写了以下代码。

/* goo_cpp.cpp */
#include "goo.h"
void goo::calc(){
    goo_calc(this);
}

/* goo_c.c */
#include "goo.h"
void goo_calc(goo *g){
    /* do something with g->a and g->b */
}
Run Code Online (Sandbox Code Playgroud)

但是gccgoo has no fields named a and …

c c++

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