본 글에서는 MISRA C 2012_05_08, 09 규칙을 소개한다.
- 외부 및 내부 연결을 가지는 식별자들은 모든 translation unit들에서 유일해야 한다.
- 외부 연결이 없는 지역 변수는 혼동 위험이 적으므로 유일하지 않아도 된다.
- 내부 연결을 가지는 식별자들은 연결이 없는 지역 변수 식별자들과도 유일해야 한다.
외부 연결: 모든 translation unit에서 식별자를 사용할 수 있다.
- 일반 전역 변수
- 일반 전역 상수(C 파일만 가능)
- 일반 함수
내부 연결: 현재 translation unit 내에서만 식별자를 사용할 수 있다.
- 정적 전역 변수
- 정적 전역 상수
- 정적 함수
- 매크로
- 인라인 함수
출처: http://blog.naver.com/netrance/110141116927
- 다음은 MISRA_C_2012_05_08 ‘외부 연결을 가지는 변수와 함수 식별자는 유일해야 한다.’ 규칙을 위배하는 예제 코드다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<file1.c>
#include <stdint.h>
const int32_t COUNT; /* 외부 연결 O */
int32_t count; /* 외부 연결 O */
void foo(void) /* 외부 연결 O */
{
int16_t index; /* 외부 연결 X */
}
/* file2.c */
#include <stdint.h>
const int32_t COUNT; /* 외부 연결 O, 다른 파일 내 상수와 충돌함 */
static void foo(void) /* 내부 연결 O, 다른 파일 내 함수와 충돌함 */
{
int16_t count; /* 외부 연결 X, 다른 파일 내의 변수와 충돌함 */
int32_t index; /* 외부 연결 X */
}
- 다음은 MISRA_C_2012_05_08 ‘외부 연결을 가지는 변수와 함수 식별자는 유일해야 한다.’ 규칙을 위배하지 않는 예제 코드다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<file1.c>
#include <stdint.h>
const int32_t COUNT; /* 외부 연결 O */
int32_t count; /* 외부 연결 O */
void foo(void) /* 외부 연결 O */
{
int16_t index; /* 외부 연결 X */
}
/* file2.c */
#include <stdint.h>
const int32_t COUNT2;
static void foo2(void)
{
int16_t count2;
int32_t index;
}
- 내부 연결을 가지는 inline 함수는 하나의 헤더 파일에서 정의해서 여러 translation unit에 include하여 사용하는 것은 허용된다. inline 함수는 외부 연결이 불가능하고 내부 연결 만을 허용한다.
- 다음은 MISRA_C_2012_05_09 ‘내부 연결을 가지는 변수와 함수 식별자는 유일해야 한다.’ 규칙의 예외사항 예제 코드다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<header.h>
inline int add_inline(int a, int b)
{
return a + b;
}
/* File: file1.c */
#include <stdio.h>
#include "header.h"
int main() {
printf("add_inline: %d\n", add_inline(100, 100));
return 0;
}
- 다음은 MISRA_C_2012_05_09 ‘내부 연결을 가지는 변수와 함수 식별자는 유일해야 한다.’ 규칙을 위배하는 예제 코드다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
<file1.c>
#include <stdint.h>
#define NUM 0 /* 내부 연결 O */
static const int32_t COUNT; /* 내부 연결 O */
static int32_t count; /* 내부 연결 O */
static void foo(void) /* 내부 연결 O */
{
int16_t count; /* 내부 연결 X, 파일 내 변수와 충돌함 */
int16_t index; /* 내부 연결 X */
}
void bar1(void)
{
static int16_t count; /* 내부 연결 O, 파일 내 변수와 충돌함 */
int16_t index; /* 유일하지 않지만, 연결이 없음 */
foo();
}
inline void var1(void) /* 내부 연결 O */
{
int16_t index;
int32_t num;
}
/* file2.c */
#include <stdint.h>
#define NUM 0 /* 내부 연결 O, 다른 파일의 변수와 충돌 */
static const int32_t COUNT; /* 내부 연결 O, 다른 파일의 상수와 충돌함 */
static int8_t count; /* 내부 연결 O, 다른 파일의 변수와 충돌함 */
static void foo(void) /* 내부 연결 O, 다른 파일의 함수와 충돌함 */
{
int32_t index; /* index와 nbytes 변수들은 유일하지 않지만 연결되지 않음 */
int16_t nbytes;
}
void bar2(void)
{
static uint8_t nbytes; /* 유일하지 않지만 같은 파일 내에 연결이 없음 */
}
inline void var1(void) /* 내부 연결 O, 다른 파일의 변수와 충돌 */
{
int16_t index;
int32_t num;
}
- 다음은 MISRA_C_2012_05_09 ‘내부 연결을 가지는 변수와 함수 식별자는 유일해야 한다.’ 규칙을 위배하지 않는 예제 코드다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
<file1.c>
#include <stdint.h>
#define NUM 0 /* 내부 연결 O */
static const int32_t COUNT; /* 내부 연결 O */
static int32_t count; /* 내부 연결 O */
static void foo(void) /* 내부 연결 O */
{
int16_t count2; /* 내부 연결 X */
int16_t index; /* 내부 연결 X */
}
void bar1(void)
{
static int16_t count3; /* 내부 연결 O */
int16_t index; /* 유일하지 않지만, 연결이 없음 */
foo();
}
inline void var1(void) /* 내부 연결 O */
{
int16_t index;
int32_t num;
}
/* file2.c */
#include <stdint.h>
#define NUM2 0 /* 내부 연결 O */
static const int32_t COUNT2; /* 내부 연결 O */
static int8_t count4; /* 내부 연결 O */
static void foo2(void) /* 내부 연결 O */
{
int32_t index; /* index와 nbytes 변수들은 유일하지 않지만 연결되지 않음 */
int16_t nbytes;
}
void bar2(void)
{
static uint8_t nbytes; /* 유일하지 않지만 같은 파일 내에 연결이 없음 */
}
inline void var2(void) /* 내부 연결 O */
{
int16_t index;
int32_t num;
}
Comments powered by Disqus.