C에서의 #pragma 사용
의 용도는 무엇입니까?#pragma
예를 들면요?
#pragma
머신 고유 또는 운영체제 고유 명령어입니다.즉, 컴파일러에 대해 모든 머신과 운영체제에 적용되거나 적용되지 않을 수 있는 작업, 옵션 설정, 액션 실행, 기본값 덮어쓰기 등을 지시합니다.
자세한 내용은 msdn을 참조하십시오.
#pragma
는 C에서 구현 고유의 무언가를 수행하기 위해 사용됩니다.즉, 이념적으로 독단적인 것이 아니라 현재의 컨텍스트에 대해 실용적입니다.
제가 자주 쓰는 건#pragma pack(1)
내장형 솔루션에서 메모리 공간을 더 많이 확보하려고 합니다. 그렇지 않으면 8바이트 얼라인먼트가 될 수 있는 구조 어레이를 사용합니다.
아쉽게도, 우리는#dogma
아직. 재밌을 것 같아요;)
일반적으로 #pragmas는 컴파일러 의존도가 높고 휴대성이 없기 때문에 가능하면 사용하지 않도록 합니다.만약 당신이 그것들을 휴대용 방식으로 사용하고 싶다면, 당신은 모든 플러그마를 둘러싸야 할 것입니다.#if
/#endif
쌍. GCC는 다른 컴파일러와의 호환성을 위해 이들 중 일부만 지원합니다. GCC는 다른 컴파일러가 플러그마를 사용하는 것과 동일한 작업을 수행하는 다른 방법이 있습니다.
예를 들어, MSVC에서 구조가 단단히 채워져 있는지(즉, 구성원 간에 패딩이 발생하지 않는지) 확인하는 방법은 다음과 같습니다.
#pragma pack(push, 1)
struct PackedStructure
{
char a;
int b;
short c;
};
#pragma pack(pop)
// sizeof(PackedStructure) == 7
GCC에서 동일한 작업을 수행하는 방법은 다음과 같습니다.
struct PackedStructure __attribute__((__packed__))
{
char a;
int b;
short c;
};
// sizeof(PackedStructure == 7)
GCC 코드가 더 이식성이 있습니다.GCC 이외의 컴파일러를 사용하여 컴파일하려면 다음 작업만 하면 됩니다.
#define __attribute__(x)
한편 MSVC 코드를 포팅하려면 각 플러그마를 에워싸야 합니다.#if
/#endif
한 쌍. 예쁘지 않아.
위의 모든 답변은 다음을 설명하는 데 도움이 됩니다.#pragma
하지만 저는 작은 예를 하나 더 추가하고 싶었습니다.
제가 설명드리고 싶은 건simple OpenMP example
용도를 몇 가지 증명하는 것#pragma
그 일을 하기 위해서
OpenMp
briefly
멀티플랫폼 공유 메모리 병렬 프로그래밍 구현입니다(그렇다면machine-specific
또는operating-system-specific
)
예를 들어보자
#include <stdio.h>
#include <omp.h>// compile with: /openmp
int main() {
#pragma omp parallel num_threads(4)
{
int i = omp_get_thread_num();
printf_s("Hello from thread %d\n", i);
}
}
출력은
Hello from thread 0
Hello from thread 1
Hello from thread 2
Hello from thread 3
Note that the order of output can vary on different machines.
자, 이제 이렇게 하자#pragma
그랬다...
OS에 4개의 스레드에서 코드 블록을 실행하도록 지시합니다.
이것은 의 하나일 뿐이다.many many applications
작은 것들로 할 수 있다#pragma
외부 샘플은 죄송합니다.OpenMP
놓는 것#pragma once
헤더 파일의 선두에 있는 것은, 1 회만 포함되어 있는 것을 확인합니다.주의:#pragma once
는 표준 C99는 아니지만 대부분의 최신 컴파일러에서 지원됩니다.
방법으로는 guards( 인크루드 가드)를할 수 .#ifndef MY_FILE #define MY_FILE ... #endif /* MY_FILE */
)
가장 좋은 조언은 컴파일러의 문서를 참조하는 것입니다.플러그마는 정의에 따라 구현에 따라 다르기 때문입니다.예를 들어 임베디드 프로젝트에서는 코드와 데이터를 다른 섹션에서 찾거나 인터럽트 핸들러를 선언하기 위해 사용합니다.
#pragma code BANK1
#pragma data BANK2
#pragma INT3 TimerHandler
#pragma startup
는 메인 뒤에 를 들어 메인 함수 뒤에 다른 함수를 호출합니다.
#pragma startup func1
#pragma exit func2
서서,,func1
달리다main
★★★★★★★★★★★★★★★★★」func2
이 후에 실행됩니다.
Turbo-C는 Turbo-C로, Turbo-C는 Turbo-C로, Turbo-C는 Turbo-C를 사용합니다.이 하려면 , GCC 를 「GCC」, 「」라고 할 수 .func1
★★★★★★★★★★★★★★★★★」func2
음음음같 뭇매하다
void __attribute__((constructor)) func1();
void __attribute__((destructor)) func2();
이것은 특정 기능을 켜거나 끌 때 사용할 수 있는 프리프로세서 디렉티브입니다.
입니다.#pragma startup
,#pragma exit
★★★★★★★★★★★★★★★★★」#pragma warn
.
#pragma startup
프로그램 시작 시 호출되는 함수를 지정할 수 있습니다.
#pragma exit
프로그램 종료 시 호출되는 함수를 지정할 수 있습니다.
#pragma warn
는 모든 경고를 억제하도록 컴퓨터에 지시합니다.
많은 타수수수수 many#pragma
스타일을 사용하여 컴파일러를 제어할 수 있습니다.
가 것은#pragma
는, 고유의 를 들어 되어 있는 해, 「」를 사용해 그의 ISR 를 할 수 .예를 들어 ISR이 기술된 특정 주소에서 프로그램카운터를 읽어들이는 상황을 나타냅니다.이 경우 를 사용하여 해당 로케이션의 ISR을 지정할 수 있습니다.#pragma vector=ADC12_VECTOR
및 rotines and and and and ines and and and and and ines and and and and and and 。
로 말하면, 요 to to to to#pragma
컴파일러에게 작업을 지시합니다.츠키다
#pragma
를 사용하여 컴파일러 경고를 무시할 수 있습니다.예를 들어 암묵적 함수 선언에 대해 GCC를 셧다운하려면 다음과 같이 입력합니다.#pragma GCC diagnostic ignored "-Wimplicit-function-declaration"
이전 버전에서는 이 기능을 휴대할 수 있습니다.
#pragma once
헤더 파일의 선두에 써넣을 경우,는 해당 헤더 파일을 1회 포함합니다.libportable
는 일단 지원되는 플러그마를 체크합니다.
언급URL : https://stackoverflow.com/questions/232785/use-of-pragma-in-c
'programing' 카테고리의 다른 글
메서드 내 Vuejs 빌드/렌더 컴포넌트와 템플릿 출력 (0) | 2022.08.10 |
---|---|
Java의 assertEquals 메서드는 신뢰할 수 있습니까? (0) | 2022.08.10 |
vue에서 항목을 클릭하는 방법 (0) | 2022.08.10 |
정규식을 사용하지 않고 자바에서 문자가 문자인지 숫자인지 확인하는 가장 좋은 방법은 무엇입니까? (0) | 2022.08.10 |
메이븐을 사용하여 단일 테스트 방법 실행 (0) | 2022.08.10 |