के बिना पूर्ण encapsulation मैं केवल एक अपूर्ण घोषणा के साथ ढेर पर एक संरचना चर घोषित करने की कोशिश कर, सी 11 और वीएलए के साथ प्रयोग कर रहा था। उद्देश्य आंतरिक संरचना (जैसे पीआईएमपीएल मुहावरे) के बिना कुछ संरचना प्रकार के चर को बनाने के लिए एक तंत्र प्रदान करना है, लेकिन ढेर पर चर बनाने की आवश्यकता के बिना और उस पर एक सूचक वापस लौटना। साथ ही, यदि संरचना लेआउट बदलता है, तो मैं संरचना का उपयोग करने वाली प्रत्येक फ़ाइल को पुन: संकलित नहीं करना चाहता हूं।मॉलोक
private.h:
#ifndef PRIVATE_H_
#define PRIVATE_H_
typedef struct A{
int value;
}A;
#endif /* PRIVATE_H_ */
public.h:
#ifndef PUBLIC_H_
#define PUBLIC_H_
typedef struct A A;
size_t A_getSizeOf(void);
void A_setValue(A * a, int value);
void A_printValue(A * a);
#endif /* PUBLIC_H_ */
implementation.c:
#include "private.h"
#include "stdio.h"
size_t A_getSizeOf(void)
{
return sizeof(A);
}
void A_setValue(A * a, int value)
{
a->value = value;
}
void A_printValue(A * a)
{
printf("%d\n", a->value);
}
मुख्य
मैं कार्यक्रम के लिए निम्न में कामयाब रहे । सी:
#include <stdalign.h>
#include <stddef.h>
#include "public.h"
#define createOnStack(type, variable) \
alignas(max_align_t) char variable ## _stack[type ## _getSizeOf()]; \
type * variable = (type *)&variable ## _stack
int main(int argc, char *argv[]) {
createOnStack(A, var);
A_setValue(var, 5335);
A_printValue(var);
}
मैंने इस कोड का परीक्षण किया है और ऐसा लगता है। हालांकि मुझे यकीन नहीं है कि क्या मैं कुछ दिख रहा हूं (जैसे एलियासिंग, संरेखण या ऐसा कुछ) जो खतरनाक या अयोग्य हो सकता है, या प्रदर्शन को नुकसान पहुंचा सकता है। इसके अलावा मैं जानना चाहता हूं कि सी
आप समझदारी से जब struct लेआउट परिवर्तन sizeof एक संकलन समय के लिए अनुकूलित किया जाएगा के रूप में recompiling के बिना ऐसा नहीं कर सकते लगातार यदि आप एक VLA या alloca – Vality
@Vality का उपयोग करें: कोड में फिर से देखो - कि एक कड़ी समय अनुकूलन होगा ; मैबस तर्क तर्क – Christoph
@ मैबस इसे पोस्ट करने के लिए धन्यवाद होना चाहिए। मैंने अन्य प्रकार के भंडारण प्रदान करने के लिए वर्णों के वीएलए का उपयोग करने के बारे में सोचा नहीं था। –