- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi,
I wrote a program that runs on Clang and GCC which relies on a function being called before the main. For this I use the __attribute__(compiler) support that is available in the other two compilers.
Is there an intel compiler alternative to this?
Thanks
- Tags:
- CC++
- Development Tools
- General Support
- Intel® C++ Compiler
- Intel® Parallel Studio XE
- Intel® System Studio
- Optimization
- Parallel Computing
- Vectorization
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi,
ICC allows __attribute__() support for user defined functions.
For instance, refer to the below code that allows you to call a function(with __attribute__ support) before main().
#include<iostream> //Function before main void beforeMain(void) __attribute__((constructor)); // implementation of beforeMain void beforeMain(void) { std::cout << "Hello before main()\n"; } int main (void) { std::cout << "hello\n"; return 0; } /* Steps to compile/run icpc filename.cpp ./a.out */
Let us know if you were successful in implementing "__attribute__" in your code whilst using icc/icpc.
--Rahul
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Rahul, Thanks for your answer. I see, I actually tried it on a single source and it worked.
I could not find it documented and my code uses it and it does not seem to execute at the beginning of the program. I am trying to find a simpler reproducible of the code I have. I will report back.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Ok, I've found the problem.
The issue is with this code:
#include <iostream> #include <stdio.h> class ACLASS { public: static void execute_static_method() __attribute__ ((constructor)) { printf("execute_static_method()\n"); } }; int main () { std::cout << "main" << std::endl; return 0; }
The real issue seems to be a warning that is not raised if you are using static methods, which is the following:
warning #470: qualified name is not allowed in member declaration
If you remove the class definition, the warning is displayed.
#include <iostream> #include <stdio.h> // This raise the warning void execute_fnc() __attribute__ ((constructor)) { printf("execute_fnc()\n"); } class ACLASS { public: // This does not raise it static void execute_static_method() __attribute__ ((constructor)) { printf("execute_static_method()\n"); } }; int main () { std::cout << "main" << std::endl; return 0; }
If you separate the definition and declaration that shows the warning, it does not display the warning at all, it executes the function, but it does not execute the static method.
#include <iostream> #include <stdio.h> void execute_fnc() __attribute__ ((constructor)); void execute_fnc(){ printf("execute_fnc()\n"); }; class ACLASS { public: static void execute_static_method() __attribute__ ((constructor)); { printf("execute_static_method()\n"); } }; int main () { std::cout << "main" << std::endl; return 0; }
The execution output is as follows
> ./main
execute_fnc()
main
But if you split the definition and declaration of the static method it does work
#include <iostream> #include <stdio.h> void execute_fnc() __attribute__ ((constructor)); void execute_fnc(){ printf("execute_fnc()\n"); }; class ACLASS { public: static void execute_static_method() __attribute__ ((constructor)); }; void ACLASS::execute_static_method() { printf("execute_static_method()\n"); } int main () { std::cout << "Here" << std::endl; return 0; }
Now I just need to figure out how to do this with my code.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi,
Great observation. Let us know if we can close this thread.
--Rahul
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Yes, I think there is an issue ticket to be open here, but as far as this thread goes that is it.
Thanks for your quick response.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi,
Thanks for the confirmation. We will go ahead and close this thread. Feel free to reach out to us, in case of further queries.
--Rahul
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page