2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
अन्तिमाङ्के[C Language] - पूर्वसंसाधनस्य विस्तृतव्याख्या (भागः २) १. अध्ययनस्य समये वयं पूर्वप्रक्रियायां मैक्रोस् इत्यस्य प्रासंगिकं ज्ञानं विस्तरेण परिचयितवन्तः मम विश्वासः अस्ति यत् सर्वेषां बहु लाभः भविष्यति। चिन्ता मा कुरुत, अस्मिन् अंके पूर्वसंसाधनविषये अन्यज्ञानं निरन्तरं ज्ञातव्यम् ।
# 运算符
मैक्रो इत्यस्य आर्गुमेण्ट् स्ट्रिंग् लिटरेल् इत्यत्र परिवर्तयति ।इदं पैरामीटर्-सहितं मैक्रो-प्रतिस्थापनसूचौ दृश्यते ।# 运算符
कृतं शल्यक्रिया "तारीकरणम्" इति अवगन्तुं शक्यते ।
तस्य किम् अर्थः ?
प्रथमं पूर्वाभासं कुर्मः : १.
int mian()
{
printf("hello" "worldn");
printf("helloworldn");
return 0;
}
उपर्युक्तयोः कोडपङ्क्तयोः मध्ये कः भेदः ? एकत्र अवलोकयामः : १.
यथा भवन्तः पश्यन्ति, द्वयोः तारयोः एकस्य तारस्य च प्रभावः समानः भवति ।C语言会把两个字符串天然连成一个字符串
, मध्ये स्थानं योजयित्वा व्यर्थम् ।
अधुना एतादृशः दृश्यः अस्ति :
int main()
{
int a = 1;
printf("The value of a is %dn", a);
int b = 20;
printf("The value of b is %dn", b);
float f = 8.5f;
printf("The value of f is %fn", f);
return 0;
}
वयं ज्ञातवन्तः यत् कोडपङ्क्तयः त्रयाणां तर्कः अतीव अस्ति相像
आम्, परन्तु सन्ति些许不同
。
अतः वयं चिन्तितवन्तः यतः ते एतावन्तः समानाः सन्ति, किं वयं तान् स्थापयितुं शक्नुमः封装成一个函数
, उपयोगसुलभतायै?
परन्तु कार्याणि एतत् कार्यं कर्तुं न शक्नुवन्ति।
तर्हि अस्माभिः किं कर्तव्यम् ?
तस्य समाधानार्थं वयं macros इत्यस्य उपयोगं कर्तुं प्रयतितुं शक्नुमः
#define Print(n, format) printf("The value of n is " format "n", n)
int main()
{
int a = 1;
Print(a, "%d");
//printf("The value of a is %dn", a);
int b = 20;
Print(b, "%d");
//printf("The value of b is %dn", b);
float f = 8.5f;
Print(f, "%f");
//printf("The value of f is %fn", f);
return 0;
}
संचालन परिणामः : १.
वयं आविष्करोमः nnन परिवर्तनं न जातम् अतः मया कथं परिवर्तनीयम् ?
अत्रैव अस्माकं # संचालकस्य उपयोगः करणीयः :# मैक्रो इत्यस्य आर्गुमेण्ट् इत्येतत् परिवर्तयतिstring literal,वर्तमाने nnन जातः “ न ” “न” २.“न”
अस्मिन् समये वयं भवितुं splicing method इत्यस्य उपयोगं कर्तुं शक्नुमः
#define Print(n, format) printf("The value of " #n " is " format "n", n)
न जानाति?अधोलिखितं व्याख्यानं पठित्वा भवन्तः अवगमिष्यन्ति।
##
तस्मिन् स्थितः भवितुम् अर्हतिउभयतः चिह्नानि एकस्मिन् प्रतीके संयोजिताः भवन्ति, यत् मैक्रो परिभाषां अनुमन्यते从分离的文本片段创建标识符
。##
इति उच्यतेचिह्न गोंद .एतादृशः संयोगः अवश्यमेव क合法
सूचकः, अन्यथा परिणामः अनिर्दिष्टः भवति।
ततः पूर्वं वयं उक्तवन्तः यत् द्वयोः सङ्ख्यायोः बृहत्तरं मूल्यं अन्वेषयति इति फंक्शन् लिखितुं भवद्भिः भिन्न-भिन्न-दत्तांशप्रकारस्य कृते भिन्नानि फंक्शन्-लेखनं करणीयम् ।
int int_max(int x, int y)
{
return x > y ? x : y;
}
float float_max(float x, float y)
{
return x > y ? x : y;
}
एतत् अनिवार्यतया अति बोझिलं, कार्यद्वयस्य च बहु साम्यम् अस्ति ।
किं शीघ्रमेव एतादृशं कार्यं निर्मातुं कोऽपि उपायः अस्ति ?कार्यवत्आचारणतथैव, केवलं एकं फंक्शन् प्रयोजयन्तु तर्हि तत् बहिः आगमिष्यति
एतादृशं एकं लिखितुं शक्नुमः宏
:
#define GENERIC_MAX(type)
type type##_max(type x, type y)
{
return x > y ? x : y;
}
#define GENERIC_MAX(type)
type type##_max(type x, type y)
{
return x > y ? x : y;
}
GENERIC_MAX(int); //相当于定义了一个函数int_max
GENERIC_MAX(float); //相当于定义了一个函数float_max
int main()
{
int r1 = int_max(3, 5);
printf("%dn", r1);
float r2 = float_max(2.3f, 7.6f);
printf("%fn", r2);
return 0;
}
संचालन परिणामः : १.
वयम् अपि शक्नुमः gcc gccछcc पर्यावरणे पूर्वसंसाधितपरिणामानां अवलोकनं कुर्वन्तु.i
file, इत्यस्य अधिकं सहजं अवगमनं भवति
अवश्यं, एवं उत्पन्नं कार्यं त्रुटिनिवारणाय अपि असुविधाजनकम् अस्ति ।
अथ अत्र ##
तस्य का भूमिका अस्ति ?
संयोजयति ##
, संकलकः तान् प्रतीकं मन्यते
कङ्गं अवलोकयामः##
परिणाम:
सामान्यतया फंक्शन्स् तथा मैक्रोस् इत्येतयोः उपयोगाय वाक्यविन्यासः अतीव समानः अस्ति, अतः语言本身没法帮我们区分二者
अस्माकं सामान्याभ्यासेषु एकः अस्ति : १.
- स्थूलस्य नामकरणं कुरुतसर्वे टोप्याः
- कार्यनामसर्वाणि टोप्याः उपयोगं न कुर्वन्तु
अवश्यं एते नामकरणनियमाः निरपेक्षाः न सन्ति
उदाहरणतया ऑफसेट ऑफसेटoffसेत एतत् मैक्रो सर्वेषु लघुवर्णेषु लिखितम् अस्ति
टीका: ऑफसेट ऑफसेटoffसेत संरचनायाः आरम्भस्थानस्य सापेक्षं संरचनासदस्यानां ऑफसेटस्य गणनाय अस्य उपयोगः भवति ।
# undef undefउनघङच निर्देशाः अभ्यस्ताः भवन्तिएकं मैक्रो परिभाषां निष्कासयन्तु
उपर्युक्तः कोडः १६९ पङ्क्तौ उपयुज्यते# undef undefउनघङच मैक्रो MAX निष्कासितम्।निष्कासनात् पूर्वं १६८ पङ्क्तयः आह्वयन् कोऽपि समस्या नास्ति, परन्तु निष्कासनानन्तरं १७० पङ्क्तयः आह्वयति चेत् त्रुटिः निवेदिता भविष्यति ।
अनेकाः C संकलकाः (VS न समाविष्टाः) आदेशपङ्क्तौ चिह्नानि परिभाषितुं क्षमताम् अयच्छन्ति ।संकलनप्रक्रियायाः आरम्भार्थं प्रयुक्तम्
उदाहरणतया : यदा वयं एकस्यामेव स्रोतसञ्चिकायाः आधारेण प्रोग्रामस्य भिन्नानि संस्करणाः संकलितुं इच्छामः तदा एतत् विशेषता उपयोगी भवति । (मानातु यत् कस्मिन्चित् कार्यक्रमे निश्चितदीर्घतायाः सरणी घोषिता अस्ति। यदि यन्त्रस्मृतिः सीमितं भवति तर्हि अस्माकं कृते अत्यल्पं सरणी आवश्यकी भवति, परन्तु यदि अन्यस्य यन्त्रस्य स्मृतिः बृहत्तरः भवति तर्हि अस्माकं आवश्यकः सरणी बृहत्तरः भवितुम् अर्हति)
आदेशपङ्क्तिपरिभाषा in अस्तिपूर्वसंसाधन चरणसंसाधितं, पूर्वसंसाधनपदे, उपरिष्टात् कोडे sz szsz इत्यस्य मूल्यं निर्धारितम् अस्ति
कार्यक्रमस्य संकलनकाले एकस्य (कथनसमूहस्य) संकलनं वा परित्यागः वा अतीव कठिनः भवति ।方便
इत्यस्य।यतः वयं उपयोक्तुं शक्नुमःसशर्त संकलन निर्देश
सशर्तसंकलननिर्देशः एषः कोडः अस्ति我想让你编译就编译,不想让你编译你就不要编译了
. वयं तस्य कृते कण्डिशन् सेट् कर्तुं शक्नुमः यदि कण्डिशन् सत्यम् अस्ति तर्हि एषः कोड् संकलितः भविष्यति यदि कण्डिशन् मिथ्या अस्ति तर्हि एषः कोड् संकलितः न भविष्यति ।
उदाहरणतया:
किञ्चित् त्रुटिनिवारणसङ्केतं विलोपयितुं दुःखदं स्यात्, परन्तु तत् स्थापयितुं मार्गे स्यात्, अतः वयं चयनात्मकरूपेण तस्य संकलनं कर्तुं शक्नुमः ।
सामान्यतया प्रयुक्ताः सशर्तसंकलननिर्देशाः : १.
#if 常量表达式
//···
#endif
#if 常量表达式
//···
#elif 常量表达式
//···
#else
//···
#endif
यत् कथनं सत्यं, तत् कथनं निष्पादितं भवति
#define M 1
int main()
{
#if M == 0
printf("hellon");
#elif M == 1
printf("worldn");
#elif M == 2
printf("csdnn");
#endif
printf("886n");
return 0;
}
#if defined(symbol)
#ifdef symbol
//上面两个的反面
if !defined(symbol)
#ifndef symbol
#if defined(OS_UNIX)
#ifdef OPTION1
unix_version_option1();
#endif
#ifdef OPTION2
unix_version_option2();
#endif
#elif defined(OS_MSDOS)
#ifdef OPTION2
msdos_version_option2();
#endif
#endif
# include "filename"
अन्वेषण रणनीतिः प्रथमे मध्येयत्र स्रोतसञ्चिकाः सन्ति तत्र परियोजनानिर्देशिकायदि शीर्षकसञ्चिका न लभ्यते तर्हि संकलकः पुस्तकालयकार्यस्य शीर्षकसञ्चिकां तथैव अन्वेषयिष्यति ।मानकस्थानस्य अवलोकनम्head File इति
यदि पुनः न लभ्यतेसंकलन त्रुटि
L inux Linuxलइत्यस्मिन्ux वातावरणस्य मानकशीर्षकसञ्चिकामार्गः (यत्र शीर्षकसञ्चिका स्थापिता अस्ति):
/usr/include
VS वातावरणस्य कृते मानकशीर्षकसञ्चिकामार्गः:
C:Program Files (x86)Microsoft Visual Studio 12.0VCinclude
//这是VS2013的默认路径
#include <filename.h>
शीर्षकसञ्चिकां अन्विष्य प्रत्यक्षतया गच्छन्तुमानक मार्गगत्वा अन्वेष्यताम्, यदि त्वं तत् न प्राप्स्यसि तर्हि त्वं प्रॉम्प्ट् प्राप्स्यसि ।संकलन त्रुटि。
किं पुस्तकालयसञ्चिकानां कृते अपि उपयोक्तुं शक्यते इति अस्य अर्थः ?“ ”
रूपं समाहितम्
उत्तरम् इतिअफीम्आम्, परन्तु अन्वेषणम् एवं क्रियतेन्यूनदक्षता, अवश्यम् एतत् अपिन सुलभं भेदं कर्तुंपुस्तकालयसञ्चिका अस्ति वा स्थानीयसञ्चिका अस्ति वा ?
पूर्ववर्तीनां (संकलनं, लिङ्किंग् च) अध्ययनं कृत्वा वयं जानीमः यत् पूर्वसंसाधनपदे हेडरसञ्चिकानां समावेशः अस्ति直接将该文件的代码拷贝到包含头文件的地方
यदि शीर्षकसञ्चिका १० वारं समाविष्टा भवति तर्हि तत् वस्तुतः १० वारं संकलितं भवति यदि सा पुनः पुनः समाविष्टा भवति तर्हि संकलनस्य दबावः अधिकः भविष्यति ।
परीक्षा । ग परीक्षणम्।गतएस्त.ग
#include "test.h"
#include "test.h"
#include "test.h"
#include "test.h"
#include "test.h"
int main()
{
return 0;
}
परीक्षा । ज परीक्षा.हतएस्त.ज
void test();
struct Stu
{
int id;
char name[20];
};
परन्तु परियोजनायां सञ्चिका बहुवारं समाविष्टा अनिवार्यतया भविष्यति, अतः एतस्याः समस्यायाः समाधानं कथं करणीयम्?
उत्तरम्:सशर्त संकलनम्
#ifndef __TEST_H__
#define __TEST_H__
//头文件的内容
#endif
कथं अवगन्तुम् ?
- प्रथमवारं शीर्षकसञ्चिकां समावेशयन्ते सति तस्याः संकलनं करणीयम्?प्रथमं न्यायं कुरुत
- __TEST_H__ इति चिह्नं नन विवक्षितम्,इच्छासंकलनम्
- तत्पश्चात् तत्क्षणमेव__TEST_H__ चिह्नं परिभाषयन्तु
- ततः पुनः हेडर सञ्चिकां समाविष्टं कृत्वा __TEST_H__ अन्वेष्टुम् ।विवक्षितम् अस्ति,न पुनःपश्चात् समाविष्टस्य शीर्षकसञ्चिकायाः कृते, प्रदर्शनं कुर्वन्तुसंकलनम्
तथापि उपर्युक्तः लेखनमार्गः अधिकं कष्टप्रदः अस्ति अन्यः लेखनस्य मार्गः अस्ति ।
#pragma once
उपर्युक्तविधिना एव प्रभावः
एतेन शीर्षकसञ्चिकानां पुनः पुनः परिचयः परिहृतः भवति
#error
#pragma
#line
···
#pragma pack()//在结构体部分介绍
इच्छुकाः मित्राणि पठितुं शक्नुवन्ति "ग भाषा का गहन शरीररचना"।
ठीकम्, अस्मिन् अंकस्य पूर्वप्रक्रियाविषये तत् सर्वं ज्ञानं आशासे यत् एषः ब्लोग् भवद्भ्यः सहायकः भवितुम् अर्हति। तत्सह, यदि किमपि त्रुटयः सन्ति तर्हि मां सम्यक् कुर्वन्तु, तथा च वयं मिलित्वा सी भाषाशिक्षणस्य मार्गे प्रगतिम् कुर्मः!