标签: c99

将默认值从Extern更改为Static

我总是忘记在我的变量和函数中添加'static'前缀,因此GCC将它们标记为extern.是否可以更改此行为,以便默认情况下将所有内容标记为静态.这两种类型在运行时是否存在性能差异,还是更正式?

c static gcc c99

0
推荐指数
1
解决办法
104
查看次数

如何在C中定义数组类型并使其成为const指针(不是指向const的指针)

我知道我可以在C中定义数组类型,如下所示:

typedef int array_t[123];
Run Code Online (Sandbox Code Playgroud)

然而,这并没有作出声明

void someFunction(array_t myArray)
Run Code Online (Sandbox Code Playgroud)

在这个意义上是恒定的

myArray=0;
Run Code Online (Sandbox Code Playgroud)

在函数内被禁止,但是

myArray[0]=0;
Run Code Online (Sandbox Code Playgroud)

被允许.

有没有办法实现这个目标?如果我在类型定义或参数声明中添加"const",我最终会得到反向行为,其中数组元素是常量,但数组指针本身是可变的.

c arrays typedef c99

0
推荐指数
1
解决办法
173
查看次数

如何在没有setenv()的情况下在ISO c99标准C中设置环境变量?

我不能用setenv()stdlib.h它不适用于C99标准的编译器.在C99中是否还有其他功能来设置环境变量?

c c99 setenv

0
推荐指数
1
解决办法
433
查看次数

用户定义的最小和最大函数的奇怪行为

我正在写一个树状的,作为其中的一部分,我需要它有两个函数,它们都返回一个指针:一个用于创建叶节点,另一个用于创建内部节点.我的头文件如下:

#ifndef NODE_H
#define NODE_H
#include<stdint.h>

typedef uint32_t Number;

typedef struct Node
{
Number val, height;
struct Node *left, *right, *parent;
} Node;

//makes leaves
Node* make_node (Number);

//makes internal nodes
Node* make_internal (Node*, Node*);

//you'll see why we need these
inline Number num_min(Number, Number);

inline Number num_max(Number, Number);

#endif
Run Code Online (Sandbox Code Playgroud)

实施如下:

#include "node.h"
#include <stdlib.h>

inline Number num_min(Number a, Number b) {
  return (a < b) ? a : b;
}

inline Number num_max(Number a, Number b) {
  return (a …
Run Code Online (Sandbox Code Playgroud)

c c99

0
推荐指数
1
解决办法
53
查看次数

在c中阻止对一个操作的优化

我正在使用补偿求和来实现一种算法,以减少累加误差累加量.我想知道我是否可以告诉编译器不要在代码的一个特定部分优化浮点运算.更确切地说,我想保持操作的顺序.这是一个示例代码片段(所有变量都是double):

while(1){
    a = y;
    e = e + d;
    y = a + e;
    e = e + (a - y);
}
Run Code Online (Sandbox Code Playgroud)

我担心最后一行可以优化读取e=e-ee = (e+a)-y.在哪种情况下会发生这种情况,我该如何预防呢?

c floating-point c99

0
推荐指数
1
解决办法
83
查看次数

在C中记录程序的标准方法是什么?

C语言中有-verbose或--debug选项的程序,它们实际上是如何实现的?不使用第三方库.

我的目标不是一直这样做:

if(debug) printf("Debug msg\n");
printf("Info msg\n"); 
Run Code Online (Sandbox Code Playgroud)

c c99

0
推荐指数
1
解决办法
121
查看次数

这个C代码不是在创建一个悬空指针吗?

阅读一些我遇到的代码

static void initializeX11SBConfig(X11SBConfig* sbConfig) {
    X11SBConfig defX11SBConfig = {
        .sbStyle = SB_STYLE_W32,
        .sbFgColor = RGB(0, 0, 0),
        .sbBgColor = RGB(255, 255, 255),
        .sbOverScroll = FALSE
    };
    defX11SBConfig.sbWidth = GetSystemMetrics(SM_CXVSCROLL);
    *sbConfig = defX11SBConfig;
}
Run Code Online (Sandbox Code Playgroud)

AFAICT defX11SBConfig是一个自动变量,因此在退出时sbConfig将指向堆栈中的某些不再有效的位置.事情应该快速炸弹,因为这些颜色参考通常在程序的其他地方使用.但他们没有.

我的C非常生疏,所以我可能会忘记默认情况下在hgeap上分配的初始化结构或者其他东西.

还有什么在这里会更好?mallocing结构?要求在进入时由sbConfig进行预分配的结构?其他?

c c99

0
推荐指数
1
解决办法
60
查看次数

使用realloc缩小内存分配

我想用来realloc从大块内存的末尾释放内存.我知道标准不要求realloc成功,即使请求的内存低于原始malloc/ calloc调用.我可以realloc,然后如果失败则返回原件吗?

// Create and fill thing1
custom_type *thing1 = calloc(big_number, sizeof(custom_type));
// ...

// Now only the beginning of thing1 is needed
assert(big_number > small_number);
custom_type *thing2 = realloc(thing1, sizeof(custom_type)*small_number);

// If all is right and just in the world, thing1 was resized in-place
// If not, but it could be copied elsewhere, this still works
if (thing2) return thing2;

// If thing2 could not be resized in-place and also …
Run Code Online (Sandbox Code Playgroud)

c malloc standards memory-management c99

0
推荐指数
1
解决办法
1221
查看次数

为什么offsetof返回size_t而不是uintptr_t?

我注意到我对offsetof的实现:

#define offsetof(st, m) ((size_t)&(((st *)0)->m))
Run Code Online (Sandbox Code Playgroud)

返回a size_t,但我认为它应该是uintptr_t因为offsetof的值最有可能用于递增指针.

我有这个功能:

int flash_seek(intptr_t offset32, int whence);
Run Code Online (Sandbox Code Playgroud)

它将FLASH的内部指针移动到另一个位置.offset32偏移也是如此.如果我想从结构的偏移量移动我的指针:

flash_seek(offsetof(foo_t, bar), SEEK_CUR);
Run Code Online (Sandbox Code Playgroud)

我得到一个警告,因为uintptr_t它的类型不一样size_t.如果我不想添加演员,我该如何纠正?

c pointers c99

0
推荐指数
1
解决办法
216
查看次数

另一个无效*主题; 我只是要问,因为我很困惑

好吧,虽然堆栈上的详细信息void*,书籍喜欢The C Programming Language (K&R)The C++ Programming Language (Stroustrup).我学到了什么?这void*是一个没有推断类型的通用指针.它需要强制转换为任何已定义的类型,并且打印void*只会产生地址.

还有什么我知道的? void*不能被解除引用,到目前为止仍然是C/C++我发现了很多关于但很少理解的一个项目.

我知道它必须是强制转换的,*(char*)void*但对我来说没有任何意义的generic指针是我必须知道我需要什么类型来获取值.我是一名Java程序员; 我理解泛型类型,但这是我挣扎的事情.

所以我写了一些代码

typedef struct node
{
  void* data;
  node* link;
}Node;

typedef struct list
{
   Node* head;
}List;

Node* add_new(void* data, Node* link);

void show(Node* head);

Node* add_new(void* data, Node* link)
{
  Node* newNode = new Node();
  newNode->data = data;
  newNode->link = link;

  return newNode;
}

void show(Node* head)
{
  while …
Run Code Online (Sandbox Code Playgroud)

c99 void-pointers c++11

0
推荐指数
1
解决办法
65
查看次数