最終編集:2019年11月20日
#pragmaは、非標準が、広くサポートされているプリプロセッサシンボルと、その主な役割は、問題が重複するファイルを導入しないようにすることです。ヘッダファイルでは、定義することができ#pragma once
たり#ifndef
、その両方ここ違いを比較します。
#pragma once
#ifndef __ARCH_ARM_SRC_ARTOSYN_AR_UART_H
#define __ARCH_ARM_SRC_ARTOSYN_AR_UART_H
#endif
一般的
防止重複したファイルには、
コンパイラの効率を向上させるためにいくつかの以前のコンパイルシステムでは、コンパイラは、独自のシステムを開発し#pragma once
、重複するファイルが含ま防ぐために。(非標準が、広くサポートされています!)
その後の発展に伴い、コンパイラのレベルが#ifndef
されている最適化された現在のコンパイル速度の両方、および違いはありません。
異なる点
#pragma once
使用することはできませんgccの3.4バージョンの前に。#ifndef
あなたは上記のような、マクロを定義する必要があるという問題があり__ARCH_ARM_SRC_ARTOSYN_AR_UART_H
、一般的にはこのマクロ_前缀_文件名_H
のフォーム、変更はファイル名に行われた場合、あなたはまた、内部のマクロを変更する必要があります。- 同じ名前を使用して別の場所のファイルに存在する場合は
#ifndef
、マクロの定義は同じですが、使用していない、警告が表示され、コンパイル時にリンク#pragma once
例外を。
.
├── hello.c
├── hello.h
├── main.c
└── Src
├── hello.c
└── hello.h
主な機能
#include <stdio.h>
#include <stdlib.h>
#include "hello.h"
#include "./Src/hello.h"
int main(int argc, char **argv)
{
say_hello();
say_hello_in_src();
exit(0);
}
gcc main.c hello.c ./Src/hello.c -o a.out
警告
main.c: In function ‘main’:
main.c:9:5: warning: implicit declaration of function ‘say_hello_in_src’ [-Wimplicit-function-declaration]
say_hello_in_src();