473,757 Members | 3,768 Online
Bytes | Software Development & Data Engineering Community
+ Post

Home Posts Topics Members FAQ

Could C++ do this without the #pragma

Stroustrup says this:

http://www.research.att.com/~bs/bs_faq2.html#macro

"So, what's wrong with using macros?"

[...Macros are really bad (I paraphrase - STH)...]

"And yes, I do know that there are things known as macros that doesn't
suffer the problems of C/C++ preprocessor macros. However, I have no
ambitions for improving C++ macros. Instead, I recommend the use of
facilities from the C++ language proper, such as inline functions,
templates, constructors (for initialization) , destructors (for cleanup),
exceptions (for exiting contexts), etc."

The GCC documentation says this:

http://gcc.gnu.org/onlinedocs/gcc-3....++%20Interface
"Declaratio ns and Definitions in One Header"

"C++ object definitions can be quite complex. In principle, your source code
will need two kinds of things for each object that you use across more than
one source file. First, you need an interface specification, describing its
structure with type declarations and function prototypes. Second, you need
the implementation itself. It can be tedious to maintain a separate
interface description in a header file, in parallel to the actual
implementation. It is also dangerous, since separate interface and
implementation definitions may not remain parallel."

[...use our cool #pragmas and don't mess with source/implementation. ..(I
paraphrase - STH) ]

Now, my question is, can the same thing GCC is doing with #pragmas be done
with something internal to C++? I can't see how. I understand that
#pragma is basically a way for the implementation to introduce behavior not
specified in the standard, so there really isn't a direct contradiction to
what Stroustrup id saying. Nonetheless, I would like to be sure there is
no way to accomplish this within the C++ language proper.
--
STH
Hatton's Law: "There is only One inviolable Law"
KDevelop: http://www.kdevelop.org SuSE: http://www.suse.com
Mozilla: http://www.mozilla.org
Jul 22 '05 #1
10 2662
Steven T. Hatton wrote:
Stroustrup says this:

http://www.research.att.com/~bs/bs_faq2.html#macro

"So, what's wrong with using macros?"

[...Macros are really bad (I paraphrase - STH)...]

"And yes, I do know that there are things known as macros that doesn't
suffer the problems of C/C++ preprocessor macros. However, I have no
ambitions for improving C++ macros. Instead, I recommend the use of
facilities from the C++ language proper, such as inline functions,
templates, constructors (for initialization) , destructors (for cleanup),
exceptions (for exiting contexts), etc."
Newbies coming to C++ from C often write obese macros, unaware that
templates and small methods are preferrable.

Here's a macro written by a non-newbie:

#define TEST_(suite, target) \
struct suite##target: public suite \
{ void runCase(); } \
a##suite##targe t; \
void suite##target:: runCase()

TEST_(TestDialo g, first_name)
{
CPPUNIT_ASSERT_ EQUAL( "Ignatz",
m_aDlg.getText( IDC_EDIT_FIRST_ NAME) );
}

Notice that it uses ## to paste tokens, and that a##suite##targe t
instantiates a small hidden object at the point where TEST_() got expressed.
You can't do these things with templates, but when you write TEST_() you
must not need to add any cruft or redundancies around it. They go inside the
macro.

Use macros for ## token pasting, # stringerization , and conditional
compilation. But if C++ treated classes as objects we could implement a more
common version of Test Collector, and not need macros.
The GCC documentation says this:

http://gcc.gnu.org/onlinedocs/gcc-3....++%20Interface "Declaratio ns and Definitions in One Header"

"C++ object definitions can be quite complex. In principle, your source code will need two kinds of things for each object that you use across more than one source file. First, you need an interface specification, describing its structure with type declarations and function prototypes. Second, you need
the implementation itself. It can be tedious to maintain a separate
interface description in a header file, in parallel to the actual
implementation. It is also dangerous, since separate interface and
implementation definitions may not remain parallel."

[...use our cool #pragmas and don't mess with source/implementation. ..(I
paraphrase - STH) ]

Now, my question is, can the same thing GCC is doing with #pragmas be done
with something internal to C++? I can't see how. I understand that
#pragma is basically a way for the implementation to introduce behavior not specified in the standard, so there really isn't a direct contradiction to
what Stroustrup id saying. Nonetheless, I would like to be sure there is
no way to accomplish this within the C++ language proper.


You misunderstand the pragma. It's only talking about the .h file's effect
on the .o files. With #prama interface the .o file only contains the names
of things in the class, so the .o file gets smaller. The pragma doesn't
affect the current translation unit ("module").

The size of .o files, the speed of compiling, and the speed of linking are
all notorious issues in the C languages. You will find many issues that only
macros can address, but they can't cover this one, because they can't
conditionally compile away things like the tables used for virtual method
dispatch.

--
Phlip
http://industrialxp.org/community/bi...UserInterfaces

Jul 22 '05 #2
Phlip wrote:
Steven T. Hatton wrote:
Stroustrup says this:

http://www.research.att.com/~bs/bs_faq2.html#macro

"So, what's wrong with using macros?"

[...Macros are really bad (I paraphrase - STH)...]
....
Newbies coming to C++ from C often write obese macros, unaware that
templates and small methods are preferrable.

Here's a macro written by a non-newbie:

#define TEST_(suite, target) \
struct suite##target: public suite \
{ void runCase(); } \
a##suite##targe t; \
void suite##target:: runCase()

TEST_(TestDialo g, first_name)
{
CPPUNIT_ASSERT_ EQUAL( "Ignatz",
m_aDlg.getText( IDC_EDIT_FIRST_ NAME) );
} .... Use macros for ## token pasting, # stringerization , and conditional
compilation. But if C++ treated classes as objects we could implement a
more common version of Test Collector, and not need macros. Here's an example fo something that does treat classes somewhat like
objects:
http://doc.trolltech.com/3.3/object.html

I believe you are hinting at something along the lines of a UBC (universal
base class) implementation. I don't believe you can sell that to the C++
Comittee. But there is certainly room for a sub-universal base class
implemented as a library. I'm starting to have visions of a development
environment that enforces certain constraints on the code in order to
confine the language to a more manageable form. For example, there would
be a required correspondence between directory structure, namespaces,
header names, and perhaps other things. I believe there is an unnecessary
number of degrees of freedom in C++. That leads to too many open-ended
situations where it is difficult to determine what a program is doing, and
how it is structured without examining a lot of details to determine which
of the equally valid options the developer chose.
The GCC documentation says this:

http://gcc.gnu.org/onlinedocs/gcc-3....++%20Interface
"Declaratio ns and Definitions in One Header"
Now, my question is, can the same thing GCC is doing with #pragmas be
done
with something internal to C++? I can't see how. I understand that
#pragma is basically a way for the implementation to introduce behavior

not
specified in the standard, so there really isn't a direct contradiction
to
what Stroustrup id saying. Nonetheless, I would like to be sure there is
no way to accomplish this within the C++ language proper.


You misunderstand the pragma. It's only talking about the .h file's effect
on the .o files. With #prama interface the .o file only contains the names
of things in the class, so the .o file gets smaller. The pragma doesn't
affect the current translation unit ("module").


My understanding is #pragmas in general are a way to cause the
implementation to behave in an implementation defined manner. Which
basically means, they can do anything the implementation can get away with.
The specific #pragma interface and #pragma implementation do influence the
way a translation unit is processed. They are also intended to be used in
conjunction with a different approach to organizing code in files.
Specifically, the entire body of code, both interface (declaration) and
implementation (definition) are contained in the same header file. The use
of the #pragma preprocessing directives instruct the compiler to produce
object code, or merely to treat the file as a mapping to the actual object
code depending on how they are used.
The size of .o files, the speed of compiling, and the speed of linking are
all notorious issues in the C languages. You will find many issues that
only macros can address, but they can't cover this one, because they can't
conditionally compile away things like the tables used for virtual method
dispatch.


I don't disagree with that, but there is more to the use of these directives
than reducing code size and compile times. I had chosen to focus on the
issues that effect source code organization, rather than compiling and
linking.

--
STH
Hatton's Law: "There is only One inviolable Law"
KDevelop: http://www.kdevelop.org SuSE: http://www.suse.com
Mozilla: http://www.mozilla.org
Jul 22 '05 #3
* "Phlip" <ph*******@yaho o.com> schriebt:

Newbies coming to C++ from C often write obese macros, unaware that
templates and small methods are preferrable.

Here's a macro written by a non-newbie:
That doesn't seem to be the case.
#define TEST_(suite, target) \
struct suite##target: public suite \
{ void runCase(); } \
a##suite##targe t; \
void suite##target:: runCase()

TEST_(TestDialo g, first_name)
{
CPPUNIT_ASSERT_ EQUAL( "Ignatz",
m_aDlg.getText( IDC_EDIT_FIRST_ NAME) );
}

Notice that it uses ## to paste tokens, and that a##suite##targe t
instantiates a small hidden object at the point where TEST_() got expressed.


Exactly.

--
A: Because it messes up the order in which people normally read text.
Q: Why is top-posting such a bad thing?
A: Top-posting.
Q: What is the most annoying thing on usenet and in e-mail?
Jul 22 '05 #4
Alf P. Steinbach wrote:
Phlip schriebt:
Newbies coming to C++ from C often write obese macros, unaware that
templates and small methods are preferrable.

Here's a macro written by a non-newbie:


That doesn't seem to be the case.
#define TEST_(suite, target) \
struct suite##target: public suite \
{ void runCase(); } \
a##suite##targe t; \
void suite##target:: runCase()

TEST_(TestDialo g, first_name)
{
CPPUNIT_ASSERT_ EQUAL( "Ignatz",
m_aDlg.getText( IDC_EDIT_FIRST_ NAME) );
}

Notice that it uses ## to paste tokens, and that a##suite##targe t
instantiates a small hidden object at the point where TEST_() got expressed.


Exactly.


Here's the same macro, from CppUnitLite, published by Object Mentors:

#define TEST(testName, testGroup)\
class testGroup##test Name##Test : public Test \
{ public: testGroup##test Name##Test () : Test (#testName "Test") {} \
void run (TestResult& result_); } \
testGroup##test Name##Instance; \
void testGroup##test Name##Test::run (TestResult& result_)

I had never looked at it before, but I see now that it also creates a
very similar small hidden object. I suspect this derives from Mike
Feathers (an author and lecturer from Object Mentor), but I downloaded
this from James Grenning (OM's director of consulting, and also a
journalist and lecturer on programming).

http://www.fitnesse.org/

So me and they seem to have parallel-evolved the same simple solution
to the "Test Collector Pattern" in C++.

Alf, as you value your reputation, please take care not to make such
an idiot of yourself on a public forum.

--
Phlip
Jul 22 '05 #5
* ph*******@yahoo .com (Phlip) schriebt:
Alf P. Steinbach wrote:
Phlip schriebt:
Newbies coming to C++ from C often write obese macros, unaware that
templates and small methods are preferrable.

Here's a macro written by a non-newbie:
That doesn't seem to be the case.
#define TEST_(suite, target) \
struct suite##target: public suite \
{ void runCase(); } \
a##suite##targe t; \
void suite##target:: runCase()

TEST_(TestDialo g, first_name)
{
CPPUNIT_ASSERT_ EQUAL( "Ignatz",
m_aDlg.getText( IDC_EDIT_FIRST_ NAME) );
}

Notice that it uses ## to paste tokens, and that a##suite##targe t
instantiates a small hidden object at the point where TEST_() got expressed.


Exactly.


Here's the same macro, from CppUnitLite, published by Object Mentors:

#define TEST(testName, testGroup)\
class testGroup##test Name##Test : public Test \
{ public: testGroup##test Name##Test () : Test (#testName "Test") {} \
void run (TestResult& result_); } \
testGroup##test Name##Instance; \
void testGroup##test Name##Test::run (TestResult& result_)


The CppUnitLite macro does something that only a macro can, namely
registering the _name_ of the test for use at runtime, and that is
presumably also why it's using a base class with virtual function.

Your macro doesn't do anything that needs a macro, and uses a totally
unnecessary base class with virtual function; it seems you have copied
and modified code without understanding the why's and wherefore's.

Alf, as you value your reputation, please take care not to make such
an idiot of yourself on a public forum.


Are you sure that is a forceful argument?

--
A: Because it messes up the order in which people normally read text.
Q: Why is top-posting such a bad thing?
A: Top-posting.
Q: What is the most annoying thing on usenet and in e-mail?
Jul 22 '05 #6
Alf P. Steinbach wrote:
Here's the same macro, from CppUnitLite, published by Object Mentors:

#define TEST(testName, testGroup)\
class testGroup##test Name##Test : public Test \
{ public: testGroup##test Name##Test () : Test (#testName "Test") {} \
void run (TestResult& result_); } \
testGroup##test Name##Instance; \
void testGroup##test Name##Test::run (TestResult& result_)


The CppUnitLite macro does something that only a macro can, namely
registering the _name_ of the test for use at runtime, and that is
presumably also why it's using a base class with virtual function.

Your macro doesn't do anything that needs a macro, and uses a totally
unnecessary base class with virtual function; it seems you have copied
and modified code without understanding the why's and wherefore's.


My macro does the same thing, the same way, using the same code techniques.
Both let you write a test case like this:

TEST(TestCase, something)
{
assert (something());
}

That prevents excess bookkeeping making a list of cases for each suite.

If you think you have an argument to defend here, write the Test Collector
Pattern in C++, with either macros or some other mechanism.

--
Phlip
http://industrialxp.org/community/bi...UserInterfaces
Jul 22 '05 #7
* "Phlip" <ph*******@yaho o.com> schriebt:
Alf P. Steinbach wrote:
Here's the same macro, from CppUnitLite, published by Object Mentors:

#define TEST(testName, testGroup)\
class testGroup##test Name##Test : public Test \
{ public: testGroup##test Name##Test () : Test (#testName "Test") {} \
void run (TestResult& result_); } \
testGroup##test Name##Instance; \
void testGroup##test Name##Test::run (TestResult& result_)

The CppUnitLite macro does something that only a macro can, namely
registering the _name_ of the test for use at runtime, and that is
presumably also why it's using a base class with virtual function.

Your macro doesn't do anything that needs a macro, and uses a totally
unnecessary base class with virtual function; it seems you have copied
and modified code without understanding the why's and wherefore's.


My macro does the same thing, the same way, using the same code techniques.


Compare
(that is, nothing) in your code, to

public: testGroup##test Name##Test () : Test (#testName "Test") {}

in the CppUnitLite code.

That is the crucial little bit of code that presumably the Test base
class (and also SimpleString, not shown in these snippets) is meant to
support, and it is the only thing that requires a macro.

It is not present in your code, so your macro does not do the same
thing; in fact it does not do the thing or any comparable thing at all.

Both let you write a test case like this:

TEST(TestCase, something)
{
assert (something());
}

That prevents excess bookkeeping making a list of cases for each suite.
So why do you think you need a macro and a base class and a virtual
function for that? You don't. It is an approach that works, yes, as
zillion other even more convoluted approaches do, but it's not an
example of a macro "written by a non-newbie", as you maintained it is.

If you think you have an argument to defend here
I'm correcting a false impression you have, intentionally or not, put
forward in a public forum, namely that your macro is a good example of
macro usage, "written by a non-newbie" -- which it absolutely is not.

write the Test Collector
Pattern in C++, with either macros or some other mechanism.


The relevant thing to do would instead be to write a macro that gives
the essential effect of the macro you presented, namely a shorthand
notation for declaring and registering a test function, sans the
unnecessary convoluted things.

For that you might find it educational to check out the Boost unit test
framework.

Which provides exactly that.

--
A: Because it messes up the order in which people normally read text.
Q: Why is top-posting such a bad thing?
A: Top-posting.
Q: What is the most annoying thing on usenet and in e-mail?
Jul 22 '05 #8
Alf P. Steinbach wrote:
My macro does the same thing, the same way, using the same code techniques.

Compare
(that is, nothing) in your code, to

public: testGroup##test Name##Test () : Test (#testName "Test") {}

in the CppUnitLite code.
My code was simpler. That line passes the name of the test to the base
class. I have used other ways to introduce the name (and I don't consider
passing it in the constructor necessarily elegant).

Both my code and the published CppUnitLite code used token pasting. To the
newbies: Use #define for token pasting, stringerization (like the
CppUnitLite sample), and conditional compilation.

(And I suspect you decided to dislike my code before finding one silly
line's difference with the other version. Your somewhat vague complaints
have been slipping...)
If you think you have an argument to defend here


I'm correcting a false impression you have, intentionally or not, put
forward in a public forum, namely that your macro is a good example of
macro usage, "written by a non-newbie" -- which it absolutely is not.


Okay. Feathers is a newbie too. We are nearing agreement!
write the Test Collector
Pattern in C++, with either macros or some other mechanism.


The relevant thing to do would instead be to write a macro that gives
the essential effect of the macro you presented, namely a shorthand
notation for declaring and registering a test function, sans the
unnecessary convoluted things.


Pardon my newbescence - what was unnecessary?

(Keep in mind both our macros permit test suite classes with setUp() and
tearDown() methods, but of course you knew that...)
For that you might find it educational to check out the Boost unit test
framework.


Do you mean this?

http://www-eleves-isia.cma.fr/docume....htm#TestSuite

void test_feature1()
{
...
}
....

ts->add( BOOST_TEST_CASE ( &test_featur e1 ) );

That's the cruft our macros avoid. In that system, you write
the test case, then go to another location in the code and
add the case to a suite. Our system uses "Test Collector",
which enroles the cases in the suites automatically, without
extra unnecessary convoluted things.

To give each suite's linked list a node, both our systems
create a small unique object, of a polymorphic type,
using token pasting.

--
Phlip
http://industrialxp.org/community/bi...UserInterfaces
Jul 22 '05 #9
Phlip wrote:
Steven T. Hatton wrote:
Stroustrup says this:

http://www.research.att.com/~bs/bs_faq2.html#macro

"So, what's wrong with using macros?"

[...Macros are really bad (I paraphrase - STH)...]

"And yes, I do know that there are things known as macros that doesn't
suffer the problems of C/C++ preprocessor macros. However, I have no
ambitions for improving C++ macros. Instead, I recommend the use of
facilities from the C++ language proper, such as inline functions,
templates, constructors (for initialization) , destructors (for cleanup),
exceptions (for exiting contexts), etc."


Newbies coming to C++ from C often write obese macros, unaware that
templates and small methods are preferrable.

Here's a macro written by a non-newbie:

#define TEST_(suite, target) \
struct suite##target: public suite \
{ void runCase(); } \
a##suite##targe t; \
void suite##target:: runCase()

TEST_(TestDialo g, first_name)
{
CPPUNIT_ASSERT_ EQUAL( "Ignatz",
m_aDlg.getText( IDC_EDIT_FIRST_ NAME) );
}

Notice that it uses ## to paste tokens, and that a##suite##targe t
instantiates a small hidden object at the point where TEST_() got
expressed. You can't do these things with templates, but when you write
TEST_() you must not need to add any cruft or redundancies around it. They
go inside the macro.

Use macros for ## token pasting, # stringerization , and conditional
compilation. But if C++ treated classes as objects we could implement a
more common version of Test Collector, and not need macros.
The GCC documentation says this:

http://gcc.gnu.org/onlinedocs/gcc-3....++%20Interface
"Declaratio ns and Definitions in One Header"

"C++ object definitions can be quite complex. In principle, your source

code
will need two kinds of things for each object that you use across more

than
one source file. First, you need an interface specification, describing

its
structure with type declarations and function prototypes.


You misunderstand the pragma. It's only talking about the .h file's effect
on the .o files. With #prama interface the .o file only contains the names
of things in the class, so the .o file gets smaller. The pragma doesn't
affect the current translation unit ("module").

The size of .o files, the speed of compiling, and the speed of linking are
all notorious issues in the C languages. You will find many issues that
only macros can address, but they can't cover this one, because they can't
conditionally compile away things like the tables used for virtual method
dispatch.


I've been discussing this on the gcc mailing list, and the responses I've
received have been along the lines of 'the documentation says _that_?'. It
seems I have not correctly understood what the #pragmas are doing, but may
have correctly understood the documentation. I.e., the documentation is
wrong. If I've accomplished anything, it will be to have the #pragma
interface/implementation deprecated, and/or the documentation corrected.

Oh, and I guess I was able to instigate yet another unseemly knock-down,
drag-out fight on c.l.c++, so it was not all for naught. :-)

--
STH
Hatton's Law: "There is only One inviolable Law"
KDevelop: http://www.kdevelop.org SuSE: http://www.suse.com
Mozilla: http://www.mozilla.org
Jul 22 '05 #10

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

27
8589
by: Jacob Jensen | last post by:
Hi I have a problem creating C++ code that is multiplatform compilable. My problem is using the "#pragma once" directive which can be used by microsoft Visual Studio pre-compiler but which gives warnings when used by gcc for example. I would like to use it when compiling with Visual C++ compiler, but how can I create a smart macro or something, so that it is truly ignored when compiler with gcc. I have tried the following which actually...
2
2814
by: Dirk Zechling | last post by:
Hello out There, i've got some Problems by moving an example code with #pragma directives to a new Microcontroller, where the C-Compiler don't know anything about pragmas. Code: ######################################### #define CALL_FROM_ISR #pragma interrupt_level 1
5
279
by: Gustavo L. Fabro | last post by:
Greetings! Going directly to the point: myclass.h: //-------------------------------------- #pragma managed //Forward declaration
15
3759
by: muttaa | last post by:
Hello all, I'm a beginner in C...May i like to know the difference between a #pragma and a #define.... Also,yet i'm unclear what a pragma is all about as i can find topics on it only in high-standard books...
1
2178
by: tmarkovski | last post by:
Hello, I found this little code which basicly writes any keystroke to the app window, however, it only works for the app window. I wanted to modify it to work when any window is focused, just like key logger. I'm too new to C++ to figure out this by myself. Any help would be much appreciated. Thanks
5
3608
by: venkat | last post by:
Hi, I have come across the a pragma definition " #pragma switch direct ". I don't know any thing about pragma's. Even i when i search through google not getting exact information. what does pragma does?. what the statment "#pragma switch direct" does?. Thanks, Venkat.
26
3823
by: Rick | last post by:
I'm told that "#pragma once" has made it into the ISO standard for either C or C++. I can't find any reference to that anywhere. If it's true, do any of you have a reference I can use? Thanks...
2
3921
by: aleemakhtar1 | last post by:
wat is use of pragma directive in embedded sys ??
4
2372
by: dissectcode | last post by:
Hello - Is there a pragma directive that will make a function be ignored? I have a function that is not currently being used and it creates a warning. I would like to fix the warning by using pragma, if possible but all I have tried isn't working... for example i tried: #pragma function(myFunct) //didn't work If pragma won't work - what is the best trick to have the compiler "ignore" a function that's not being used? thanks!
0
9487
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However, people are often confused as to whether an ONU can Work As a Router. In this blog post, we’ll explore What is ONU, What Is Router, ONU & Router’s main usage, and What is the difference between ONU and Router. Let’s take a closer look ! Part I. Meaning of...
0
10069
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers, it seems that the internal comparison operator "<=>" tries to promote arguments from unsigned to signed. This is as boiled down as I can make it. Here is my compilation command: g++-12 -std=c++20 -Wnarrowing bit_field.cpp Here is the code in...
1
9884
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows Update option using the Control Panel or Settings app; it automatically checks for updates and installs any it finds, whether you like it or not. For most users, this new feature is actually very convenient. If you want to control the update process,...
0
9735
tracyyun
by: tracyyun | last post by:
Dear forum friends, With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each protocol has its own unique characteristics and advantages, but as a user who is planning to build a smart home system, I am a bit confused by the choice of these technologies. I'm particularly interested in Zigbee because I've heard it does some...
1
7285
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome a new presenter, Adolph Dupré who will be discussing some powerful techniques for using class modules. He will explain when you may want to use classes instead of User Defined Types (UDT). For example, to manage the data in unbound forms. Adolph will...
0
6556
by: conductexam | last post by:
I have .net C# application in which I am extracting data from word file and save it in database particularly. To store word all data as it is I am converting the whole word file firstly in HTML and then checking html paragraph one by one. At the time of converting from word file to html my equations which are in the word document file was convert into image. Globals.ThisAddIn.Application.ActiveDocument.Select();...
0
5168
by: TSSRALBI | last post by:
Hello I'm a network technician in training and I need your help. I am currently learning how to create and manage the different types of VPNs and I have a question about LAN-to-LAN VPNs. The last exercise I practiced was to create a LAN-to-LAN VPN between two Pfsense firewalls, by using IPSEC protocols. I succeeded, with both firewalls in the same network. But I'm wondering if it's possible to do the same thing, with 2 Pfsense firewalls...
3
3395
muto222
by: muto222 | last post by:
How can i add a mobile payment intergratation into php mysql website.
3
2697
bsmnconsultancy
by: bsmnconsultancy | last post by:
In today's digital era, a well-designed website is crucial for businesses looking to succeed. Whether you're a small business owner or a large corporation in Toronto, having a strong online presence can significantly impact your brand's success. BSMN Consultancy, a leader in Website Development in Toronto offers valuable insights into creating effective websites that not only look great but also perform exceptionally well. In this comprehensive...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.