#Define 的用法 可以用在代碼替換,跟條件編譯
1.代碼替換
#define A 1000;
int s = A;//對於編譯器來說就是編譯的時候 編譯器看到那行會是 int s= 1000;
---------------------------------------------------------------------------------------------------
可以帶入參數
#define A(a,b) cout<<a,b;
A(a,b); // cout<<a,b;;
---------------------------------------------------------------------------------------------------
可以利用定義多行 來達到 寫函式的視覺效果(但實際上不是函式)
#define F(x) \
{\
if(x>100)\
{\
cout<<x;\
}\
}
---------------------------------------------------------------------------------------------------
2.條件編譯
#ifdef F_Test
//如果有定義F_Test的話 編譯這區塊
#else
//如果沒有定義F_Test的話 編譯這區塊
#endif
#ifndef
#define F_test
//可以確保這個區塊避免被重複定義
#endif
3.結論
(1) #define 就真的只是代碼的替換而已 ,就跟在記事本使用取代的功能很像(如果沒帶參數的話,就完全一樣),他的參數也是使用取代特性,
(2)#define跟函式差異最大的地方在於, 函式是佔有有實體空間的,函式有邏輯性
(3)函式不能重複定義,define可以,但要注意後蓋前
#define FX 200
#define FX 100
cout<<FX;
結果會是100
(4)好好利用後蓋前的特性的話,可以做到交叉比對,或是有效的Mark掉函式
void A(x){ cout<<x++;};
void B(x){};//空函式 等同於mark掉
#define A B
這時候你會發現只要是有include到這個define的A函式都會變成B函式
試想一下,假設你要暫時性的把所有A(X)都替換成B(X),選項一當然是使用全部取代的功能,
可是一來怕萬一將來又要改回來的話,二來怕取代的過程之中不小心手殘取代錯的話,
這時候可以利用#define來達到這個目的
2018年5月23日 星期三
2018年5月22日 星期二
使用C++內建函式 log要偵錯的變數到檔案之中
#include "stdafx.h"
#include<stdio.h> //fopen fprintf
#include <time.h> //tm time_t localtime time()
#include<iostream>
using namespace std;
int main()
{
FILE* a_file;
time_t t_time;
char buff[100];
memset(buff, 0, 100 * sizeof(char));
sprintf_s(buff, "..\\file_path%d%d.txt", 1, 2);
fopen_s(&a_file,buff, "a");//w:開啟寫入檔案,從頭開始寫 a:開啟寫入檔案,從資料末端開始寫 如果檔案不存在會產生新檔案
if (a_file)
{
//開檔成功
char buff[80];
time(&t_time);//取得目前時間
tm* datetime = new tm;
localtime_s(datetime,&t_time);
for (int i = 0; i < 80/3; i++)
{
memset(buff, 0, 80 * sizeof(char));
sprintf_s(buff, "%02X ", i);//假設此為要記錄的變數 ,要以16進制呈現
//fwrite(buff,1,strlen(buff), a_file);
fprintf(a_file, "%d/%d/%d %d:%d:%d %s\n", datetime->tm_year+1900, datetime->tm_mon+1, datetime->tm_mday, datetime->tm_hour, datetime->tm_min, datetime->tm_sec, buff);
}
}
fclose(a_file);
int test;
cin >> test;
return 0;
}
2018年5月20日 星期日
C++ 動態配置/釋放多維陣列
動態一維
配置:
char* buff = new char[len];
釋放:
delete[] buff;
動態二維
配置:
char** buff =new char*[len1]
for(int i=0; i<len2;i++)
buff[i]= new char[len2];
釋放:
for(int i=0; i<len2;i++)
delete[] buff[i];
delete[] buff;
動態三維
char*** buff = new char**[len1];
for (int i = 0; i < len1; i++)
{
buff[i] = new char*[len2];
for (int j = 0; j < len2; j++)
buff[i][j] = new char[len3];
}
釋放:
for (int i = 0; i < len2; i++)
{
for (int j = 0; j < len2; j++)
delete[] buff[i][j];
delete[]buff[i];
}
delete[] buff;
可以發現跟stack的概念有點像(後進先出)
犯過的語法錯誤-1:
char** buff[i] = new (char*)[len];(X)
char** buff[i] = new char*[len];(0)
誇號把它刮起來會出現compiler error
(char*) 會出錯的原因應該是被compiler視作強制轉型的語法,而new後面應該是要接型別名稱才對
結論就是new 後面 不要亂夸型別
犯過的語法錯誤-2:
另外由於接觸過各類不同的語法,所以發生過[]與() 混淆的錯誤
int* buff[i] = new int(len);(X)
int* buff[i] = new int[len];(O)
兩者compiler都會過,然而
第一種可能會有run time error,原因在於()是用來配置初始值的,所以乍看會誤以為
配置了len長度的陣列,但是事實上只是配置了一個初始值為len的陣列
訂閱:
文章 (Atom)