小编Sal*_*lim的帖子

C中的静态和外部内联函数

我试图详细了解静态和外部函数之间的区别.

我知道静态和外部内联函数之间的基本区别.

如果错误,请纠正我的理解:

  • 静态内联函数仅对定义它的转换单元可见.
  • extern内联函数可以在多个翻译单元中访问.
  • 最好在头文件中定义内联函数
  • 静态和静态内联函数定义之间没有区别.

下面是一个示例代码,我对此行为感到困惑.

在file1.c

#include <stdio.h>
#include "file.h"

int main(void)
{
  fun1(); 
  return 0;  
}

static inline void fun1(void)
{
  int i;
  for (i = 0; i < 10; i++) {
      static int k = 20;
      printf("Value : %d \n", k++);
  }
}
Run Code Online (Sandbox Code Playgroud)

file2.c中

#include <stdio.h>

inline void fun1(void)
{
  int i;
  int k = 0;
  for (i = 0; i < 10; i++) {
      printf("Value : %d \n", k++);
  }
}
Run Code Online (Sandbox Code Playgroud)

file.h

#ifndef FILE_H …
Run Code Online (Sandbox Code Playgroud)

c

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

软约束对于位变量无法正常工作

我有一个可变数据,我希望最后一位为 1,其余位为 0,我使用软约束编写了它。

class ABC;
  rand bit [3:0] data;

  // This constraint is defined as "soft" 
  constraint c_data {
                       soft data == 0;
                            data[0] == 1;
                    }
endclass

module tb;
  ABC abc;

  initial begin
    abc = new;
    abc.randomize();
    $display ("data = %0b", abc.data);
  end
endmodule
Run Code Online (Sandbox Code Playgroud)

我希望输出为'b0001,但实际输出为 data = 1101”

constraints system-verilog

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

MISRA C-2012规则11.3违规,同时尝试从char到int指针进行类型转换

我试图从我的代码中删除规则11.3.

示例代码:

static int32_t 
do_test(const char *cp)
{
    const char *c = cp;
    const int32_t *x;
    x = (const int32_t *)cp;

    return *x;
}
Run Code Online (Sandbox Code Playgroud)

我希望*c和*x的值相同.即使代码正在编译并给出正确的值,"x =(int32_t*)cp;" 导致违反11.3和11.8

规则11.3违规:具有指针类型的对象不应转换为指向不同对象类型的指针.

我已尝试使用void指针,但结果与我的预期不一样,并且还导致了额外的违规.

反正有没有删除这些违规行为?

从MISRA C 2012文档中可以看出,这个规则有一个例外,因为它允许将指向对象类型的指针转​​换为指向对象类型char,signed char或unsigned char之一的指针.标准保证可以使用指向这些类型的指针来访问对象的各个字节.

由于char类型而忽略Dir 4.6.

c pointers casting misra

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

即使使用初始化变量,MISRA C 2012也违反了规则9.1

我试图从我的代码中删除违规规则9.1.

规则9.1:具有自动存储持续时间的对象的值在设置之前不应被读取

示例代码:

#include <stdint.h>
#include <stdbool.h>
#define VAL 0xABCDEFABU

int32_t main(void);
static int32_t do_test(bool k);
static void func(uint64_t *var3, const uint64_t *var5);

int32_t 
main (void)
{
    bool b = false;

    int32_t y = do_test(b);

    return y;
}

static int32_t
do_test(bool k)
{
    uint64_t i = 0, var4[10];

    int32_t result = 0;

    for(i = 0U; i < 10U; i++) {
      var4[i] = VAL + i;
    }

    if(k == false) {
      uint64_t var2[10];
      func(var2, var4);

      if(var2[9] == var4[9]) {
        result = …
Run Code Online (Sandbox Code Playgroud)

c misra

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

标签 统计

c ×3

misra ×2

casting ×1

constraints ×1

pointers ×1

system-verilog ×1