請問如何在c 中判斷乙個變數是否存在?

時間 2021-06-03 21:12:07

1樓:Betty

來拋磚引玉一下。

首先定義乙個標頭檔案 FIND_VARIABLE.hpp

#ifndef FIND_VARIABLE_HPP_INCLUDED

#define FIND_VARIABLE_HPP_INCLUDED

#if defined(_MSC_VER) && (_MSC_VER >= 1020)

#pragma once

#endif

#include

#include

namespace

marcoHelper

~VariableRecoder

()};

inline

void

current_function_helper

()//獲取函式完整的簽名

}#define _declare(TYPE,NAME,TYPE2,...) \

TYPE NAME TYPE2;\

marcoHelper::VariableRecoder __HIDDEN_VARIABLE_##NAME\

(CURRENT_FUNCTION+std::string("+"#NAME));

#define _find(NAME)\

(marcoHelper::VariableRecoder::VARIABLE_NAME_TABLE.

find(CURRENT_FUNCTION+std::string("+"#NAME))!=\

marcoHelper::VariableRecoder::VARIABLE_NAME_TABLE.end())

#endif

// #ifndef CURRENT_FUNCTION_HPP_INCLUDED

然後就可以在執行時判斷變數是否存在了。

呼叫_Declare()巨集來宣告乙個變數。

呼叫_Find()巨集來判斷變數是否存在,如果存在就返回1,如果不存在返回0

#include

#include

#include

#include

"FIND_VARIABLE.hpp"

intrecursion

(int

dep)

inttest

()int

test

(int

value

),,};

_declare

(std

::vector

,v3

,,,,);

//int(*v4)(int,int)=nullptr;

using

funcPtr

=int(*

)(int

,int

);_declare

(funcPtr,v4

,,nullptr

);if

(_find(v3

))將宣告包起來,不過,通常來說這樣的定義是沒有意義的

}//當前作用域不存在變數v0

assert(!

_find(v0

));//當前作用域存在變數v4

assert

(_find(v4

));//v2==1

assert(v2

==1);//當前作用域不存在變數v5

assert(!

_find(v5

));//當前作用域不存在變數v6

assert(!

_find(v6

));//遞迴呼叫也能正常工作

assert

(recursion(10

)==10);

return0;

}int

main

(void

)這個實現儲存了當前呼叫棧中所有的變數名,實現的功能比題主要求的多一些。它是玩具級別的,因為它執行時求值,在雜湊表的插入和查詢中浪費了大量的時間,顯然不符合c++的設計哲學。

理論上來說,應該能利用constexpr特性做到編譯時求值,消除執行時的額外代價,不過我不知道如何來實現,只能作罷。

2樓:小莊讀書

乙個辦法是使用指標:

如果定義了a這個變數,則指標賦值為a的位址,如果沒有定義a變數,則指標賦值為空。

在給變數b賦值的地方,根據指向變數a的指標是否為空來選擇賦值1還是0。

3樓:C十十20年

編譯後,全域性和靜態變數名資訊在.exe檔案內還存在,但.exe檔案載入到記憶體後就變成位址訪問了,再沒有名稱資訊。

也許你說我通過掃瞄.exe檔案,可以得知其存在,畢竟實現起來太麻煩。還有一種變數編譯後在.

exe檔案中是無名的:函式引數或其區域性非static變數,所以更加沒辦法得知某個變數存在:考慮到它可以和全域性變數同名,因此也會影響到全域性變數的訪問,因為區域性非static變數是優先被訪問的,你怎麼能確定訪問的就是全域性變數,而不是編譯之前的函式非static同名區域性變數呢?

C 中如何判斷乙個變數的型別是否為指標?

我覺得題主應該是之前學過某種動態型別的語言 比如python js 想要學C C 於是才會有這個疑問吧?C或者C 屬於靜態型別語言,你一般不會遇到這個問題,至少目前應該是不會,因為乙個變數在傳遞過程中你必須要明確他的型別,那你怎麼可能不知道它是不是指標?比如說你在題目中說的 fun A 在C和C 中...

c 如何在編譯期判斷乙個物件是否是字串字面值?

套路有點偏 這個是簡化版本,轉義符和寬字元都沒有處理,實用版本留給讀者思考好了 滾 include include define is literal x is literal f x,sizeof x 1 define is literal x is literal x constexpr inl...

C 如何在類中定義乙個 C 函式(不用傳遞 this,非友元,非靜態)?

悽臨雨 無捕獲的lambda,可以轉型為c函式指標。類內巢狀類可以定義靜態函式 不一定合乎要求 但據我所知都只能獲取指標,沒辦法定義c函式 因為c函式應當處在c的命名空間中 陸海綿 使用函式指標成員指向乙個類外定義的C函式。extern c class Avoid p int 實在想不到哪種應用場景...