"Assert" 기능은 무엇입니까?
를 알게 되었습니다.assert
능 、 、 、 、 "
assert
는 해당 인수가 거짓으로 판명될 경우 프로그램을 종료합니다(통상은 assert 스테이트먼트를 인용한 메시지 포함).이것은 보통 디버깅 중에 예기치 않은 상황이 발생했을 때 프로그램 장애를 보다 명확하게 하기 위해 사용됩니다.
예를 들어 다음과 같습니다.
assert(length >= 0); // die if length is negative.
다음과 같이 실패했을 때 표시되는 보다 유용한 메시지를 추가할 수도 있습니다.
assert(length >= 0 && "Whoops, length can't possibly be negative! (didn't we just check 10 lines ago?) Tell jsmith");
또는 다음과 같습니다.
assert(("Length can't possibly be negative! Tell jsmith", length >= 0));
, 의 를 제거할 .assert
를 합니다.NDEBUG
매크로, 보통 컴파일러 스위치를 사용합니다.결과적으로 프로그램이 아사트 매크로 실행에 의존해서는 안 됩니다.
// BAD
assert(x++);
// GOOD
assert(x);
x++;
// Watch out! Depends on the function:
assert(foo());
// Here's a safer way:
int ret = foo();
assert(ret);
프로그램 호출 abort()와 아무것도 보증되지 않는 것의 조합으로, 예를 들어 사용자가 문자가 아닌 숫자를 입력하는 것이 아니라 개발자가 가정한 것을 테스트하는 데만 사용해야 합니다(다른 수단으로 처리해야 함).
assert computer 문장은 영어로 확인하는 문장과 유사합니다.
을 보다.
많은 컴파일러가 assert() 매크로를 제공합니다.assert() 매크로는 파라미터가 TRUE로 평가되면 TRUE를 반환하고 FALSE로 평가되면 어떤 액션을 수행합니다.많은 컴파일러가 실패한 assert()로 프로그램을 중단합니다.다른 컴파일러는 예외를 발생시킵니다.
assert() 매크로의 강력한 기능 중 하나는 DEBUG가 정의되지 않은 경우 프리프로세서가 이를 코드 없음으로 압축하는 것입니다.개발 시 큰 도움이 되며, 최종 제품이 출하될 때 성능 저하나 프로그램 실행 가능 버전의 크기 증가가 없습니다.
사람들
#include <stdio.h>
#include <assert.h>
void analyze (char *, int);
int main(void)
{
char *string = "ABC";
int length = 3;
analyze(string, length);
printf("The string %s is not null or empty, "
"and has length %d \n", string, length);
}
void analyze(char *string, int length)
{
assert(string != NULL); /* cannot be NULL */
assert(*string != '\0'); /* cannot be empty */
assert(length > 0); /* must be positive */
}
/**************** Output should be similar to ******************
The string ABC is not null or empty, and has length 3
assertbugs.assert()를 할 수 .C로 됩니다.<assert.h>
에서는 C++로 되어 있습니다.<cassert>
은 ★★★★★★★★★★★★★★.
void assert(int expression);
인수식은 테스트하는 임의의 변수 또는 임의의 C 식입니다.식이 TRUE로 평가되면 assert()는 아무것도 수행하지 않습니다.식이 FALSE로 평가되면 assert()는 stderr에 오류 메시지를 표시하고 프로그램 실행을 중단합니다.
assert()는 어떻게 사용합니까?컴파일 오류와 다른 프로그램 버그를 추적하는 데 가장 자주 사용됩니다.버그가 있다고 해서 프로그램이 컴파일 되는 것은 아니지만, 잘못된 결과를 가져오거나 잘못 실행(예를 들어 잠김)됩니다.예를 들어, 당신이 쓰고 있는 재무 분석 프로그램은 때때로 잘못된 답을 줄 수 있다.이 문제는 변수 rest_rate가 음의 값을 취하기 때문에 발생한 것으로 생각됩니다.이 값은 절대 발생해서는 안 됩니다.이것을 확인하려면 , 스테이트먼트를 배치해 주세요.
assert(interest_rate > = 0). 프로그램 내에서 interest_rate가 사용되는 위치에 있습니다.변수가 음이 되면 assert() 매크로에 의해 경고가 표시됩니다.그런 다음 관련 코드를 조사하여 문제의 원인을 찾을 수 있습니다.
assert()가 어떻게 동작하는지를 확인하려면 , 다음의 샘플 프로그램을 실행합니다.0이 아닌 값을 입력하면 프로그램이 값을 표시하고 정상적으로 종료합니다.0 을 입력하면 assert() 매크로에 의해 비정상적인 프로그램 종료가 강제됩니다.표시되는 에러 메세지는, 사용의 컴파일러에 의해서 다릅니다만, 일반적인 예는 다음과 같습니다.
Assertion 실패: x, file list19_3.c, line 13: assert()가 동작하기 위해서는 프로그램이 디버깅모드로 컴파일 되어 있어야 합니다.디버깅 모드를 유효하게 하는 방법에 대해서는, 사용의 컴파일러의 메뉴얼을 참조해 주세요(순간 설명).나중에 릴리스 모드로 최종 버전을 컴파일하면 assert() 매크로는 디세블이 됩니다.
int x;
printf("\nEnter an integer value: ");
scanf("%d", &x);
assert(x >= 0);
printf("You entered %d.\n", x);
return(0);
정수 값 10을 입력합니다.
10을 입력했습니다.
정수 값 입력: -1
오류 메시지:비정상적인 프로그램 종료
시스템 및 컴파일러에 따라 오류 메시지가 다를 수 있지만 일반적인 생각은 동일합니다.
assert() 함수를 일반 함수보다 사용하는 주된 이유는 세 가지입니다.
assert() 함수는 주로 디버깅 단계에서 사용됩니다.최종 코드로 진행되지 않을 수 있는 조건을 테스트할 때마다 printf 문을 사용하여 쓰는 것은 귀찮습니다.
대규모 소프트웨어 전개에서는 assert() 함수의 헤더파일을 링크하기 전에 정의된 NDEBUG 매크로를 사용하여 assert 문을 컴파일러가 무시하도록 할 수 있습니다.
assert()는 함수 또는 일부 코드를 설계할 때 도움이 되며, 코드가 어떤 제한으로 기능하고 기능하지 않는지 아이디어를 얻고 마지막으로 if를 포함하여 기본적으로 전제조건을 충족시키는 경우에 편리합니다.
'예외 제기'나 '중지 실행'과 같은 것은 대부분의 컴파일러에 해당될 수 있지만 모든 컴파일러에는 해당되지 않습니다.(BTW, 실제로 예외를 던지는 단언 문장이 있습니까?)
여기 c6x와 다른 TI 컴파일러에 의해 사용되는 흥미롭고 약간 다른 의미가 있습니다.이러한 컴파일러는 특정 어설션 스테이트먼트를 보고 해당 스테이트먼트의 정보를 사용하여 특정 최적화를 수행합니다.못된.
C의 예:
int dot_product(short *x, short *y, short z)
{
int sum = 0
int i;
assert( ( (int)(x) & 0x3 ) == 0 );
assert( ( (int)(y) & 0x3 ) == 0 );
for( i = 0 ; i < z ; ++i )
sum += x[ i ] * y[ i ];
return sum;
}
이를 통해 어레이는 32비트 경계에 정렬되어 있기 때문에 컴파일러는 이러한 종류의 정렬을 위해 특정 명령을 생성할 수 있습니다.
C++11 N3337 표준 드래프트
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf
19.3 주장
1 (표42)에 기재되어 있는 헤더 <캐스터트>는 C++ 프로그램 어사션을 문서화하는 매크로와 어사션 체크를 무효화하는 메커니즘을 제공한다.
2 내용은 Standard C 라이브러리 헤더 <assert>와 동일합니다.h > 。
C99 N1256 표준 드래프트
http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf
7.2 Diagnostics <어카운트>h>
헤더 1 ' '
<assert.h>
하고, 매크로인 「마크로」를 합니다.NDEBUG
문장은 이 문장으로 되지 않습니다.<assert.h>
.NDEBUG
는 소스 파일 내의 <macro name>에서 매크로 이름으로 정의됩니다.h>가 포함되어 있습니다.ASST as as음 음음음음 as음 as as as as as as#define assert(ignore) ((void)0)
는 Assert "NDEBUG"가 될 에 따라 됩니다.
<assert.h>
포함되어 있습니다.(2) 아사트 매크로는 실제 기능이 아닌 매크로로서 실시해야 한다.실제 함수에 액세스하기 위해 매크로 정의가 억제된 경우 동작은 정의되지 않습니다.
7.2.1 프로그램 진단
7.2.1.1 주장 매크로
개요
1.
#include <assert.h> void assert(scalar expression);
묘사
합니다.2 아아 puts puts puts puts puts puts 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 。실행 시 식(스칼라 타입을 가질 것)이 false인 경우(즉, 0과 비교), 아사트 매크로는 실패한 특정 콜에 대한 정보(인수 텍스트, 소스 파일 이름, 소스 회선 번호, 인클로징 함수의 이름 포함)를 씁니다. 매크로의 자 of입입 val .ues
__FILE__
그리고.__LINE__
및 식별자__func__
표준 에러 스트림에 대해서, 실장 정의 포맷으로 지정합니다.165).그 후, Abort 함수를 호출합니다.돌아온다
3 아사트 매크로는 값을 반환하지 않습니다.
또한 동적 할당이 성공했는지 여부를 확인하기 위해 사용할 수 있습니다.
코드 예:
int ** p;
p = new int * [5]; // Dynamic array (size 5) of pointers to int
for (int i = 0; i < 5; ++i) {
p[i] = new int[3]; // Each i(ptr) is now pointing to a dynamic
// array (size 3) of actual int values
}
assert (p); // Check the dynamic allocation.
유사점:
if (p == NULL) {
cout << "dynamic allocation failed" << endl;
exit(1);
}
평가한 값이 false일 경우 프로그램 실행을 중지하는 함수입니다.일반적으로 릴리스 설정으로 컴파일할 때 결과 바이너리로 컴파일되지 않도록 매크로로 둘러싸여 있습니다.
이것은, 지금까지의 전제 조건의 테스트에 사용할 수 있도록 설계되어 있습니다.예를 들어 다음과 같습니다.
void strcpy(char* dest, char* src){
//pointers shouldn't be null
assert(dest!=null);
assert(src!=null);
//copy string
while(*dest++ = *src++);
}
당신이 원하는 이상적인 방법은 잘못된 인수로 함수를 호출하는 것과 같이 프로그램에서 오류를 범할 수 있고, 그것이 세그폴트(또는 예상대로 작동하지 않음)하기 전에 아사트를 치는 것입니다.
언급URL : https://stackoverflow.com/questions/1571340/what-is-the-assert-function
'programing' 카테고리의 다른 글
Java 어소시에이션 어레이 (0) | 2022.08.18 |
---|---|
컴포넌트 내 믹스인 콜방식(Vuej) (0) | 2022.08.18 |
Vue 2.0 $on()으로 마이그레이션해도 $emit()이 들리지 않습니다. (0) | 2022.08.18 |
파이어베이스 호스팅을 사용할 때 vuej의 환경 변수에 파이어베이스 구성 매개 변수를 저장하는 방법 (0) | 2022.08.18 |
VueJ - 슬롯 래핑 요소에 스타일 적용 (0) | 2022.08.18 |